抽象工厂设计模式

抽象工厂


  1. 简单介绍

    抽象工厂模式属于创建型设计模式,是工厂模式的一种实现。工厂方法是按产品级维度对工厂进行抽象,而抽象工厂是按产品族维度对工厂进行抽象。产品级可以简单的理解为具体的单个产品,产品族则是有多个产品构成。如苹果公司生产的手机、手表等单个产品可以简单理解为产品级,这些苹果公司生产的这一系列产品(手机、手表)放在一起则可以简单理解为一个产品族。

  2. 使用场景

    业务中需要针对产品族维度的扩展,且不需要针对产品级维度的扩展。抽象工厂对产品族维度的扩展时能很好的满足OCP原则,但是针对产品级维度的扩展时,则不能满足OCP原则。

  3. 场景举例

    JDK中的List接口定义了多个抽象方法(size()、get(int index)、Object[] toArray()),可以将单个方法理解成一个产品级,List中的所有方法构成一个产品族。具体的实现工厂是ArrayList,LinkedList。

  4. UML类图

抽象工厂UML类图

  1. 具体实现

    • 故事背景

      樱桃公司(CherryCompany)是一家连锁水果公司,对外售卖的水果品种高达数十种(产品级),而这数十种水果有分为进口水果和国产水果(产品族)。樱桃公司只在一家名为ImportFruitFactory的公司采购进口水果。在一家名为公司DomesticFruitFactory采购国产水果,现在樱桃公司决定分别采购国内外的苹果和香蕉:

      public interface Apple {
      }
      
      public interface Banana {
      }
      
      /**
       * 国产苹果
       */
      public class DomesticApple implements Apple {
      }
      
      /**
       * 国产香蕉
       */
      public class DomesticBanana implements Banana {
      }
      
      /**
       * 进口苹果
       */
      public class ImportApple implements Apple {
      }
      
      /**
       * 进口香蕉
       */
      public class ImportBanana implements Banana {
      }
      
      public interface Factory {
          Banana getBanana();
          Apple getApple();
      }
      
      /**
       * 负责生产国产水果产品族的香蕉和苹果
       */
      public class DomesticFruitFactory implements {
          Apple getApple(){
              return new DomesticApple();
          }
          Banana getBanana() {
              return new DomesticBanana();
          }
      }
      
      /**
       * 负责生产进口水果产品族的香蕉和苹果
       */
      public class ImportFruitFactory implements {
          Apple getApple(){
              return new ImportApple();
          }
          Banana getBanana() {
              return new ImportBanana();
          }
      }
      
  2. 源码展示

    • JDK中容器的List机器子类的实现伪代码

      public interface List<E> extends Collection<E> {
          // 将这些方法组合,理解成一个产品族
          int size();
          Iterator<E> iterator();
          Object[] toArray();
      }
      
      public class ArrayList<E> implements Iterable<E> {
          
          public int size() {
              return size;
          }
          
          public Iterator<E> iterator() {
              return new Itr();
          }
          
          public Object[] toArray() {
              return Arrays.copyOf(elementData, size);
          }
      }
      
      public class LinkedList<E> implements Iterable<E> {
          
          public int size() {
              return size;
          }
          
          public Iterator<E> iterator() {
              return new Itr();
          }
          
          public Object[] toArray() {
              Object[] result = new Object[size];
              int i = 0;
              for (Node<E> x = first; x != null; x = x.next)
                  result[i++] = x.item;
              return result;
          }
          
          public Iterator<E> iterator() {
              return listIterator();
          }
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值