抽象工厂(Abstract Factory)
介绍
提供一个创建一系列
相关或相互依赖对象的接口,无需指定它们具体的类;具体工厂负责实现具体产品。
看图说话
实例
抽象工厂
public interface AbstractFactory { //又能造汽车 AbstractCar createProductCar(); //还可以造口罩(Mask) AbstractMask createProductMask(); }
抽象出汽车接口
public interface AbstractCar { void run(); }
抽象出口罩接口
public interface AbstractMask { void defense(); }
分别做抽象产品的实现(汽车和口罩的实现)
//口罩的具体产品 public class N95 implements AbstractMask{ @Override public void defense() { System.out.println("我N95防护非常快!"); } } public class N100 implements AbstractMask{ @Override public void defense() { System.out.println("我N100防护快的不得了!"); } } //汽车的具体产品 public class BenchiCar implements AbstractCar{ @Override public void run() { System.out.println("我是奔驰,我可以跑跳着跑!"); } } public class WulingCar implements AbstractCar{ @Override public void run() { System.out.println("我是五菱,我能飞!"); } }
对象工厂
因为工厂实现的是抽象工厂接口,抽象工厂又有多个产品接口,这样具体的工厂是不是就可以创建多个产品了呢?
public class CarFactory implements AbstractFactory{ @Override public AbstractCar createProductCar() { return new BenchiCar(); } @Override public AbstractMask createProductMask() { return new N95(); } } public class MaskFactory implements AbstractFactory{ @Override public AbstractCar createProductCar() { return new WulingCar(); } @Override public AbstractMask createProductMask() { return new N100(); } }
客户端
客户端通过创建工厂就可以完成多种类产品的创建,这就是对象工厂带给我们的好处了
public class Client { public static void main(String[] args) { CarFactory carFactory = new CarFactory(); carFactory.createProductCar(); carFactory.createProductMask(); } }
总结
1.使用场景
- 需要多个系列产品
- 系统需要提供一个产品库,所有产品都以同样的接口出现,客户端不需要依赖具体的实现
- 如果要动态的切换产品簇
2.本质是什么?
- 选择产品簇的实现。
- 工厂方法是选择单个产品的实现,抽象工厂是为一个产品簇选择实现的,如果抽象工厂里只定义一个方法,那就是抽象方法模式了
3.它解决了什么问题?
将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。
使用者可以直接消费产品而不需要知道生产的细节
4.它体现了设计模式中什么原则?
- 更符合开闭原则
- 单一职责
5.存在的缺陷?
如果有新产品添加,那么就需要去修改抽象工厂的接口,这样就会抽象工厂类和下面的子类都会受到牵连
6.你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?
抽象工厂和抽象方法最大的区别是,抽象工厂每个厂都可以创建多种类的产品;工厂方法没个厂只能建立一种产品
7.开源架构中哪些使用了这一模式?
未完待续......