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

  1. 工厂方法模式中只能创建一类对象,但是不能创建多个类型的产品。

  2. 产品族是在抽象工厂模式中,在抽象工厂模式中,产品组是指有同一个工厂生产位于不同产品等级结构中的一组产品。

    在这里插入图片描述

  3. 抽象工厂模式提供一个接口,用于创建相关或者依赖的对象的家族,而不需要明确指定具体类。

  4. 抽象工厂允许客户端使用抽象的接口来创建一组相关的产品,而不需要关心实际产出的具体产品是什么,这样,客户就可以从具体的产品中被解耦。

  5. 一般来说,产品种类单一,适合用工厂模式;如果有多种产品,每种产品又有不同的类型的时候,可以通过抽象工厂模式来创建。

  6. 抽奖工厂模式的UML图

  7. 抽奖工厂模式的实现过程

    1. 创建两个产品类

      /**
       * 抽象产品类
       */
      public abstract class Pizza {
      
          abstract void prepare();
      
          abstract void create();
      
          abstract void complete();
      }
      
      public abstract class Milk {
      
          abstract void prepare();
      
          abstract void create();
      
          abstract void complete();
      }
      
    2. 创建具体的产品

      /**
       * 蔬菜披萨
       */
      public class PizzaVegg extends Pizza {
      
          @Override
          public void prepare() {
              System.out.println("准备蔬菜");
          }
      
          @Override
          public void create() {
              System.out.println("制作蔬菜");
          }
      
          @Override
          public void complete() {
              System.out.println("制作蔬菜成功");
          }
      
      }
      
      public class AppleMilk extends Milk {
          @Override
          void prepare() {
              System.out.println("准备苹果味牛奶");
          }
      
          @Override
          void create() {
              System.out.println("制作苹果味牛奶");
          }
      
          @Override
          void complete() {
              System.out.println("苹果味牛奶制作完成");
          }
      }
      
    3. 创建抽象工厂类

      public interface AbstractFactory {
      
          Pizza createPizza(String type);
      
          Milk createMilk(String type);
      }
      
    4. 创建两个不同产品等级的具体工厂

      public class ColdFoodFactory implements AbstractFactory {
      
          @Override
          public Pizza createPizza(String type) {
              Pizza pizza = null;
              if(type.equals("VEGG")){
                  pizza = new PizzaVegg();
                  pizza.prepare();
                  pizza.complete();
              }
              return pizza;
          }
      
          @Override
          public Milk createMilk(String type) {
              Milk milk = null;
              if(type.equals("APPLE")){
                  milk = new AppleMilk();
                  milk.prepare();
                  milk.complete();
              }
              return milk;
          }
      
      }
      
      /**
       * 生产的是一个产品族,包含了牛奶和披萨,产品的等级结构是Hot
       */
      public class HotFoodFactory implements AbstractFactory {
      
          @Override
          public Pizza createPizza(String type) {
              Pizza pizza = null;
              if(type.equals("VEGG")){
                  pizza = new PizzaVegg();
                  pizza.prepare();
                  pizza.create();
                  pizza.complete();
              }
      
              return pizza;
          }
      
          @Override
          public Milk createMilk(String type) {
              Milk milk = null;
              if(type.equals("APPLE")){
                  milk = new AppleMilk();
                  milk.prepare();
                  milk.create();
                  milk.complete();
              }
              return milk;
          }
      
      }
      
    5. 创建集体的店面类

      public class Store {
      
          public static void comsume(String foodType, String type, String pizzaType){
              if("pizza".equals(foodType)){
                  if("hot".equals(type)){
                      HotFoodFactory hotFoodFactory = new HotFoodFactory();
                      hotFoodFactory.createPizza(pizzaType);
                  }
                  if("cold".equals(type)){
                      ColdFoodFactory coldFoodFactory = new ColdFoodFactory();
                      coldFoodFactory.createPizza(pizzaType);
                  }
              } else if("milk".equals(foodType)){
                  if("hot".equals(type)){
                      HotFoodFactory hotFoodFactory = new HotFoodFactory();
                      hotFoodFactory.createMilk(pizzaType);
                  }
                  if("cold".equals(type)){
                      ColdFoodFactory coldFoodFactory = new ColdFoodFactory();
                      coldFoodFactory.createMilk(pizzaType);
                  }
              }
          }
      
          public static void main(String[] args) {
              comsume("pizza", "cold", "VEGG");
          }
      }
      
  8. 抽象工厂模式的优点

    1. 抽奖工厂隔离了具体类的生成,客户端不需要知道具体的创建过程,所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体的工厂实例,就可以改变整个软件系统的行为。
    2. 当一个产品族中的多个对象被设计成一起工作时,能够保证客户端始终只是用同一个产品族中的对象。
  9. 抽象工厂模式的缺点

    1. 添加新的行为时比较麻烦,如果添加一个新产品族对象时,需要更改接口及其下面的所有子类,很带来很大的麻烦(这个缺点是简单工厂模式也有的缺点)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值