设计模式 - 工厂模式3

抽象工厂模式

1.1 概念

  • 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

  • 抽象工厂模式是工厂模式的升级版(也不能称作是升级版),在有很多个业务品牌、业务分类时,通过抽象工厂模式生产需要的对象是一种非常好的解决方案。
    在这里插入图片描述

  • 一个抽象工厂模式例子的类图:

在这里插入图片描述

  • 以下是完成这张类图:

    • 结构:

在这里插入图片描述

- 其中,Seat、Engine、Tyre 是汽车部件,它们三个组成了一条抽象的产品族。在这些接口中,有实现类,分别造出高端的零部件和低端的零部件。然后有一个工厂接口,工厂接口中的方法实现了返回汽车的零部件。然后高端汽车工厂类(LuxuryCarFactory.java)和低端汽车工厂类(LowCarFactory.java)分别实现造高端车的零部件和低端车的零部件(返回实体)。最后,实例化高端汽车工厂类(LuxuryCarFactory.java和低端汽车工厂类(LowCarFactory.java)就可以通过方法创建对象,调用对象的方法。

- 以下是具体的内容;

- Engine.java:

  ```java
  public interface Engine {
      void run();
      void start();
  }
  
  class LuxuryEngine implements Engine {
  
      @Override
      public void run() {
          System.out.println("转速快");
      }
  
      @Override
      public void start() {
          System.out.println("启动快!可以自动启停");
      }
  }
  
  class LowEngine implements Engine {
  
      @Override
      public void run() {
          System.out.println("转的慢");
      }
  
      @Override
      public void start() {
          System.out.println("启动慢");
      }
  }
  ```

- Tyre.java:

  ```java
  public interface Tyre {
      void revolve();
  }
  
  class LuxuryTyre implements Tyre {
  
      @Override
      public void revolve() {
          System.out.println("磨损慢");
      }
  }
  
  class LowTyre implements Tyre {
  
      @Override
      public void revolve() {
          System.out.println("磨损快");
      }
  }
  ```

- Seat.java:

  ```java
  public interface Seat {
      void massage();
  }
  
  class LuxurySeat implements Seat {
  
      @Override
      public void massage() {
          System.out.println("可以自动按摩");
      }
  }
  
  class LowSeat implements Seat {
  
      @Override
      public void massage() {
          System.out.println("不能按摩");
      }
  }
  ```

- CarFactory.java

  ```java
  public interface CarFactory {
      Engine createEngine();
      Seat createSeat();
      Tyre createTyre();
  }
  ```

- LuxuryCarFactory.java:

  ```java
  public class LuxuryCarFactory implements CarFactory {
      @Override
      public Engine createEngine() {
          return new LuxuryEngine();
      }
  
      @Override
      public Seat createSeat() {
          return new LuxurySeat();
      }
  
      @Override
      public Tyre createTyre() {
          return new LuxuryTyre();
      }
  }
  ```

- LowCarFactory.java

  ```java
  public class LowCarFactory implements CarFactory {
      @Override
      public Engine createEngine() {
          return new LowEngine();
      }
  
      @Override
      public Seat createSeat() {
          return new LowSeat();
      }
  
      @Override
      public Tyre createTyre() {
          return new LowTyre();
      }
  }
  
  ```

- Client(main).java

  ```java
  public class Client {
  
      public static void main(String[] args) {
          CarFactory factory = new LuxuryCarFactory();
          Engine e = factory.createEngine();
          e.run();
          e.start();
      }
  
  }
  // 转速快
  // 启动快!可以自动启停
  ```

1.2 总结

​ 抽象工厂模式实际并不像之前的简单工厂模式和工厂方法模式那样可以直接用来增加新的产品。但是它可以用来生产产品族。可以在内部通过返回多个不同的对象,来实现创建产品族的效果。

​ 在抽象工厂类内部再添加一个方法,返回一个对象,也只是在产品族多添加了一个产品,生产出来的还是产品族。

​ 当你使用到抽象工厂时,这个项目就已经非常大,很复杂了。

​ 工厂模式以后可以会和单例模式结合起来,比如servlet就是单例模式和工厂模式结合起来的;spring 中的 IOC 容器创建管理 bean 对象也是 单例模式加工厂模式或者工厂模式加原型模式。所以工厂模式是一个大的模式,会很多模式结合起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值