美文网首页
工厂模式

工厂模式

作者: Gxy_8c77 | 来源:发表于2020-03-16 14:13 被阅读0次

    简介:工厂模式大体分为 简单工厂,工厂方法,抽象工厂等三种模式。工厂方法模式也可以称为工厂模式。简单工厂进阶变成工厂方法,然后在进阶成抽象工厂、

    简单工厂模式

    又叫做静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品的实例,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品继承自一个父类或接口)的实例

    工厂:负责实现创建所有实例的内部逻辑,并提供一个外界调用的方法,创建所需的产品对象

    抽象产品:负责描述产品的公共接口

    具体产品:描述生产的具体产品

    代码

    抽象产品类

    /**

    * @program: Design

    * @description: 抽象产品

    * @author: czg

    * @create: 2020-03-03 20:08

    **/

    public abstract class Product {

        //产品介绍

        abstract void intro();

    }

    具体的产品类 实现了抽象产品类的接口

    public class BProduct extends Product{

        @Override

        void intro() {

            System.out.println("雪碧");

        }

    }

    public class AProduct extends Product {

        @Override

        void intro(){

            System.out.println("--可乐--");

        }

    }

    public class CProduct extends Product {

        @Override

        void intro() {

            System.out.println("芬达");

        }

    }

    工厂类 + 测试

    public class Factory {

        public static void main(String[] args) {

            Product a = getProduct("A");

            a.intro();

            Product b = getProduct("B");

            b.intro();

            Product c = getProduct("C");

            c.intro();

        }

        /**

         * 根据入参 创建相应的对象

         * @param type

         * @return

         */

        public static Product getProduct(String type){

            switch (type){

                case "A":

                    return new AProduct();

                case "B":

                    return new BProduct();

                case "C":

                    return new CProduct();

                default:

                    return null;

            }

        }

    }

    优点:将创建使用工作分开,不必关心类对象如何创建,实现了解耦

    缺点:违背了开放-关闭原则 一旦添加新产品就不得不修改工厂类的逻辑,这样会造成工厂类逻辑复杂

    工厂方法模式

    又称工厂模式,多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而自雷则负责生产具体的对象,一种常用的对象创建设计模式,此模式的核心精神是封装类中不变的部分

    作用:将类的实例化延迟到工厂类中完成,即由自雷来决定该实例化哪一个类

    抽象工厂:描述具体工厂的公共接口

    具体工厂:描述具体工厂,创建产品的实例,供外接调用

    抽象产品:负责描述产品的公共接口

    具体产品:描述生成的具体产品

    代码

    抽象产品以及具体产品

    public abstract class Product {

        abstract void intro();

    }

    /**

    * @program: Design

    * @description: 具体产品A

    * @author: czg

    * @create: 2020-03-03 21:04

    **/

    public class ProductA extends Product {

        @Override

        void intro() {

            System.out.println("AAAA");

        }

    }

    /**

    * @program: Design

    * @description: 具体产品B

    * @author: czg

    * @create: 2020-03-03 21:04

    **/

    public class ProductB extends Product {

        @Override

        void intro() {

            System.out.println("BBBBBB");

        }

    }

    抽象工厂  具体工厂

    public abstract class Factory {

        abstract Product getProduct();

    }

    public class FactoryA extends Factory {

        @Override

        Product getProduct() {

            return new ProductA();

        }

    }

    public class FactoryB extends Factory {

        @Override

        Product getProduct() {

            return new ProductB();

        }

    }

    测试类

    public class Test {

        public static void main(String[] args) {

            FactoryA a = new FactoryA();

            a.getProduct().intro();

            FactoryB b = new FactoryB();

            b.getProduct().intro();

        }

    }

    一个抽象产品可以派生出多个具体产品,一个抽象工厂可以派生出多个具体工厂类,每个具体的工厂只能创建一个具体的产品实例

    优点

    符合开闭原则:增加一种产品,只需要增加相应的具体产品类和相应的工厂子类即可

    符合单一原则:每个工厂类只负责创建对应的产品

    缺点

    增加了系统的复杂度:类的个数将成对增加

    增加了系统的抽象性和理解难度

    一个具体的工厂只能创建一种具体的产品

    抽象工厂模式

    定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类;具体的工厂负责实现具体的产品实例。

    抽象工厂模式与工厂模式最大的区别:抽象工厂模式中每个工厂可以创建多种类的产品,而工厂模式每个工厂只能创建一类

    抽象工厂:描述具体工厂的公共接口

    具体工厂:描述具体工厂,创建产品的实例,供外接调用

    抽象产品族:描述抽象产品的公共接口

    抽象产品:描述具体产品的公共接口

    具体产品:具体产品

    代码

    抽象产品   抽象产品族  具体产品

    //抽象产品类  接口

    public abstract class Product {

        /**

         * 产品介绍

         */

        abstract void intro();

    }

    //抽象产品族

    public abstract class ProductA extends Product {

        @Override

        abstract void intro();

    }

    public abstract class ProductB extends Product{

        @Override

        abstract void intro();

    }

    //具体产品

    public class ProductAa extends ProductA {

        @Override

        void intro() {

            System.out.println("农夫山泉");

        }

    }

    public class ProductBb extends ProductB {

        @Override

        void intro() {

            System.out.println("面包");

        }

    }

    抽象工厂   具体工厂

    // 抽象工厂

    public abstract class Factory {

        abstract Product  getProductA();

        abstract Product  getProductB();

    }

    // 具体工厂

    public class FactoryA extends Factory {

        @Override

        Product getProductA() {

            return new ProductAa();

        }

        @Override

        Product getProductB() {

            return new ProductBb();

        }

    }

    测试

    public class Test {

        public static void main(String[] args) {

            FactoryA factoryA = new FactoryA();

            factoryA.getProductA().intro();

            factoryA.getProductB().intro();

        }

    }

    多个抽象产品类,每个抽象的产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出具体工厂类,每个具体工厂类可以创建多个具体产品的实例

    优点

    降低耦合

    符合开闭原则

    符合单一职责原则

    不适用静态工厂方法,可以形成基于继承的登记结构

    缺点

    难以扩展新种类产品

    总结

        简单工厂:具体工厂,抽象产品  具体产品

    工厂方法:抽象工厂,具体工厂,抽象产品,具体产品

    抽象工厂:抽象工厂,具体工厂,抽象产品族,抽象产品,具体产品

    定义

    简单工厂:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(继承自一个父类或接口)的实例。 产品得工厂

    工厂方法:定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象 工厂的工厂

    抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。  复杂产品得工厂

    相关文章

      网友评论

          本文标题:工厂模式

          本文链接:https://www.haomeiwen.com/subject/cnegehtx.html