­

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

  • 2019 年 10 月 4 日
  • 筆記

1

写在前面的话

这一章我们来学习一下抽象工厂模式

• 抽象工厂模式

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

– 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

总的来说,它是创建一类产品,而不是单个产品。

2

抽象工厂模式

用一个代码示例来解释抽象工厂

  1. 首先我们通过模拟造车工厂,把车上的引擎和座椅分为两类,一类是奢华的,一类是很low的

2.我们来创建Engine.java (引擎接口)和Seat.java( 座椅接口 ),并且分别写出奢华和low两种情况的类。

public interface Engine {      void run();  }    /***   * 在引擎里面分为  奢华(Luxury)和 垃圾(low)   */  class LuxuryEngine implements Engine{        @Override      public void run() {          System.out.println("奢华引擎,跑的超快!");      }  }  class LowEngine implements Engine{        @Override      public void run() {          System.out.println("很菜的引擎,跑的慢!");      }  }
public interface Seat {       void feel();  }  /***   * 在座椅里面分为  奢华(Luxury)和 垃圾(low)   */  class LuxurySeat implements Seat{        @Override      public void feel() {          System.out.println("超级舒服!");      }  }  class LowSeat implements Seat{        @Override      public void feel() {          System.out.println("坐的很不爽");      }  }

3.然后我们来开始创建工厂接口 —CarFactory.java

  public interface CarFactory {      Engine createEngine();      Seat createSeat();    }

在这个接口里,我们提供了创建引擎和创建座椅的方法,并且返回Engine和Seat对象。

4. 因为抽象工厂是创建一个产品族,而不是单个产品,所以我们来创建一个生产low的产品的工厂和一个生产奢华的产品的工厂,这两个工厂都继承于Carfactory接口。

public class LowFactory implements CarFactory {      @Override      public Engine createEngine() {          return new LowEngine();      }        @Override      public Seat createSeat() {          return new LowSeat();      }  }
public class LuxuryFactory implements CarFactory {      @Override      public Engine createEngine() {          return new LuxuryEngine();      }        @Override      public Seat createSeat() {          return new LuxurySeat();      }  }

5. 最后我们来测试一下我们的代码:

public class Test {      public static void main(String[] args){          CarFactory carFactory =new LuxuryFactory();          Engine engine = carFactory.createEngine();          engine.run();            CarFactory carFactory1  = new LowFactory();          Seat seat = carFactory1.createSeat();          seat.feel();      }  }

输出结果:

奢华引擎,跑的超快!  坐的很不爽    Process finished with exit code 0

分析:可以看出三个工厂都有自己的利弊之处,但是实际开发中,抽象工厂和方法工厂用的比较少,因为它的结构较简单工厂更加的复杂,一般抽象工厂都用于jdk开发和一些大型开源框架中。