抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
便于理解的说,工厂方法模式创建一种对象,抽象工厂模式创建一类(多种)对象。
不同工厂生产果汁和水果派,会采用不同的水果,得到的果汁和派也不一样。
1,定义果汁和派
public interface Juice { void show();}public interface Pie { void show();}
2,假设有两个原材料,分别是苹果和香蕉,每种水果可以制作两种产品。
public class AppleJuice implements Juice { @Override public void show() { System.out.println("Apple juice"); }}public class ApplePie implements Pie { @Override public void show() { System.out.println("Apple pie"); }}
public class BananaJuice implements Juice { @Override public void show() { System.out.println("Banana Juice"); }}public class BananaPie implements Pie { @Override public void show() { System.out.println("Bnanana pie"); }}
3,定义抽象工厂,具有生产果汁和派的能力
public abstract class AbstractFactory { public abstract Juice createJuice(); public abstract Pie createPie();}
4,苹果工厂
public class AppleFactory extends AbstractFactory{ @Override public Juice createJuice() { return new AppleJuice(); } @Override public Pie createPie() { return new ApplePie(); }}
香蕉工厂
public class BananaFactory extends AbstractFactory { @Override public Juice createJuice() { return new BananaJuice(); } @Override public Pie createPie() { return new BananaPie(); }}
6,客户端获得苹果汁和苹果派
public class AbstractFactoryPattern { public static void main(String[] args) { AbstractFactory factory = new AppleFactory(); //AbstractFactory factory = new ChocolateFactory(); factory.createJuice().show(); factory.createPie().show(); }}
7,控制台输出
Apple juiceApple pieProcess finished with exit code 0
抽象工厂模式优点:
如果想要加入巧克力系列,先建立巧克力汁类和巧克力派类,然后建立巧克力工厂,就可以在客户端获得巧克力系列产品了(如上图中注释代码),无需更改原有代码,完全符合开放封闭原则。
对象的产生依赖抽象类,而不依赖具体的实现,完全符合依赖倒转原则。
缺点:
如果想在原工厂中增加水果饼干产品,那么要增加饼干接口,苹果饼干类,香蕉饼干类, 还要更改抽象工厂,苹果工厂,香蕉工厂的代码,麻烦。