概念定义
抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品。换句话说,抽象工厂创建一整套具有相互依赖或作用关系的产品(至少两个产品),而工厂方法中的工厂只能创建单一系列的产品。
应用场景
- 客户端不需要知道它所创建的对象的类。
- 需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况。
- 系统结构稳定,不会频繁地增加对象。
示例代码
抽象工厂模式由工厂接口(或抽象类)、一组实现工厂接口工厂类、一个产品接口(或抽象类)和一组实现产品接口的具体产品组成。
本节通过一个"喜闻乐见"的豪车系列,展示抽象工厂模式的实现。示例代码如下(注意豪车有两个产品 -- 引擎和娱乐系统):
// 产品接口 - 引擎 // public interface IEngine { void show(); } // 若干具体的产品 - 宝马与奔驰的引擎 // public class BmwEngine implements IEngine { @Override public void show() { System.out.println("Bmw's engine"); } } public class BenzEngine implements IEngine { @Override public void show() { System.out.println("Benz's engine"); } } // 产品接口 - 娱乐系统 // public interface IEntertainment { void show(); } // 若干具体的产品 - 宝马与奔驰的娱乐系统 // public class BmwEntertainment implements IEntertainment { @Override public void show() { System.out.println("Bmw's entertainment"); } } public class BenzEntertainment implements IEntertainment { @Override public void show() { System.out.println("Benz's entertainment"); } } // 抽象工厂接口 // public interface IFactory { public IEngine createEngine(); // 不必为引擎和娱乐系统分别增加两个工厂接口! public IEntertainment createEntertainment(); } // 若干具体的工厂 - 为车创建引擎和娱乐系统 // public class BmwFactory implements IFactory { // 结合了工厂方法模式 @Override public IEngine createEngine() { return new BmwEngine(); } @Override public IEntertainment createEntertainment() { return new BmwEntertainment(); } } public class BenzFactory implements IFactory { @Override public IEngine createEngine() { return new BenzEngine(); } @Override public IEntertainment createEntertainment() { return new BenzEntertainment(); } }
客户端通过如下方式调用:
IFactory bmwFactory = new BmwFactory(); bmwFactory.createEngine().show(); bmwFactory.createEntertainment().show(); IFactory benzFactory = new BenzFactory(); benzFactory.createEngine().show(); benzFactory.createEntertainment().show();
模式优缺点
抽象工厂模式的优点如下:
- 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点如下:
- 产品族扩展非常困难。增加一个系列的某一产品时,需要同时修改抽象工厂和具体工厂。
业界实践
略