• 学习设计模式之抽象工厂模式


    抽象工厂模式
    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。

    类结构图
    在这里插入图片描述
    Creator
    抽象工厂接口,里面应该包括所有的产品创建的抽象方法。
    ConcreteCreator1、ConcreteCreator2
    具体的工厂,创建具有特定实现的产品对象。
    ProductA、ProductB
    抽象产品,它们都可能有两种不同的实现。
    ProductA1、A2、B1、B2
    对两个抽象产品的具体分类的实现。

    代码示例

    /**
     * ProductA 产品族
     */
    public interface ProductA {
        void methodA();
    }
    
    /**
     * ProductA 产品族
     */
    interface ProductB {
        void methodB();
    }
    
    public class ProductA1 implements ProductA {
        @Override
        public void methodA() {
            System.out.println("产品A系列中的1号产品的方法!");
        }
    }
    
    class ProductA2 implements ProductA {
        @Override
        public void methodA() {
            System.out.println("产品A系列中的2号产品的方法!");
        }
    }
    
    public class ProductB1 implements ProductB {
        @Override
        public void methodB() {
            System.out.println("产品B系列中的1号产品的方法!");
        }
    }
    
    class ProductB2 implements ProductB {
        @Override
        public void methodB() {
            System.out.println("产品B系列中的2号产品的方法!");
        }
    }
    
    public interface Creator {
        ProductA getProductA();
    
        ProductB getProductB();
    }
    
    public class ConcreteCreator1 implements Creator {
    
        @Override
        public ProductA getProductA() {
            return new ProductA1();
        }
    
        @Override
        public ProductB getProductB() {
            return new ProductB1();
        }
    }
    
    public class ConcreteCreator2 implements Creator {
    
        @Override
        public ProductA getProductA() {
            return new ProductA2();
        }
    
        @Override
        public ProductB getProductB() {
            return new ProductB2();
        }
    }
    

    客户端示例

    public class Client {
        public static void main(String[] args) {
            Creator creator = new ConcreteCreator1();
            ProductA productA = creator.getProductA();
            ProductB productB = creator.getProductB();
            productA.methodA();
            productB.methodB();
    
            creator = new ConcreteCreator2();
            productA = creator.getProductA();
            productB = creator.getProductB();
            productA.methodA();
            productB.methodB();
        }
    }
    

    运行结果

    产品A系列中的1号产品的方法!
    产品B系列中的1号产品的方法!
    产品A系列中的2号产品的方法!
    产品B系列中的2号产品的方法!
    
    Process finished with exit code 0
    

    这样客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法就可以得到所需要的产品对象,至于具体是哪一个产品对象,客户端并不知道。实现了解耦。

    优点

    1. 它分离了具体的类。
    2. 它使得易于交换产品系列。
    3. 它有利于产品的一致性。

    缺点

    难以支持新种类的产品,产生新的产品品种很麻烦,改动很多。

    勿在浮沙筑高台 ——个人浅见,难免有误导之处,麻烦请指出。
  • 相关阅读:
    理解和应用队列机制
    Visual Studio for Mac第四预
    宇宙第一开发工具
    Visual Studio 2017
    Vue开源
    Redux 和 ngrx 创建更佳的 Angular 2
    Redis缓存用起来
    C#6
    spring声明式事务 同一类内方法调用事务失效
    Spring事务管理--多个ORM框架在使用时的情况分析
  • 原文地址:https://www.cnblogs.com/liufeichn/p/11961645.html
Copyright © 2020-2023  润新知