抽象工厂(Abstract Factory)模式提供一个建立一系列相关或相互依赖对象的接口,而无需指定它们具体的类。java
抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品。换句话说,抽象工厂建立一整套具备相互依赖或做用关系的产品(至少两个产品),而工厂方法中的工厂只能建立单一系列的产品。ide
抽象工厂模式由工厂接口(或抽象类)、一组实现工厂接口工厂类、一个产品接口(或抽象类)和一组实现产品接口的具体产品组成。设计
本节经过一个"喜闻乐见"的豪车系列,展现抽象工厂模式的实现。示例代码以下(注意豪车有两个产品 -- 引擎和娱乐系统):code
// 产品接口 - 引擎 // 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();
抽象工厂模式的优势以下:接口
缺点以下:产品
略class