美文网首页
抽象工厂模式

抽象工厂模式

作者: 无人之境215 | 来源:发表于2016-12-28 23:29 被阅读5次

    抽象工厂模式

    介绍

    为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

    在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    与工厂模式区别

    • 工厂模式针对的是一个产品等级结构,而抽象工厂模式则是针对的多个产品等级结构,也就是说,工厂模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

    • 抽象工厂模式所提供的一系列产品就组成一个产品族,而工厂方法提供的一系列产品为一个等级结构

    实例

    应用工厂本身就是一个抽象工厂,有多个产品等级结构,衍生自不同的接口或抽象类。

    模型

    设计模式-抽象工厂模式.JPG

    使用方法

    • 创建接口
    interface IProductA{
      public void function();
    }
    
    interface IProductB{
      public void function();
    }
    
    • 创建实现接口的实体类
    class ProductA1 implements IProductA{
      public void function() {
      }
    }
    
    class ProductA2 implements IProductA{
      public void function() {
      }
    }
    
    class ProductB1 implements IProductB{
      public void function() {
      }
    }
    
    class ProductB2 implements IProductB{
      public void function() {
      }
    }
    
    • 创建抽象工厂
    abstract class Factory1{
      abstract IProductA getProductA1();
      abstract IProductB getProductB1();
    }
    
    abstract class Factory2{
      abstract IProductA getProductA2();
      abstract IProductB getProductB2();
    }
    
    • 创建具体工厂来生产相关产品
    class ConcreteFactory1 extends Factory1{
      public IProductA getProductA1() {
        return new ProductA1();
      }
      public IProductB getProductB1() {
        return new ProductB1();
      }
    }
    
    class ConcreteFactory2 extends Factory2{
      public IProductA getProductA2() {
        return new ProductA2();
      }
      public IProductB getProductB2() {
        return new ProductB2();
      }
    }
    
    • 客户端根据需要获取产品实例
    public class Client{
        public void getProductInstance(){
            Factory1 factory1 = new ConcreteFactory1();
            IProductA productA1 = factory1.getProductA1();
            IProductB productB1 = factory1.getProductB1();
    
            productA1.function();
            productB1.function();
    
            Factory2 factory2 = new ConcreteFactory2();
            IProductA productA2 = factory2.getProductA2();
            IProductB productB2 = factory2.getProductB2();
            productA2.function();
            productB2.function();
        }
    }
    

    优缺点

    • 优点:符合开闭原则,可以在类的内部对产品族进行约束,当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
    • 缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量

    相关文章

      网友评论

          本文标题:抽象工厂模式

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