
抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
使用抽象工厂模式一般要满足以下条件。
抽象工厂模式的主要角色如下。
抽象工厂模式结构图如图所示:

以华为、小米2个品牌,分别生产手机、路由器为例,代码如下(产品类别接口以及对应工厂接口):
/*** 手机产品接口*/
public interface IPhoneProduct {/*** 开机*/void start();/*** 关机*/void shutdown();/*** 拨打电话*/void callUp();/*** 发送短信*/void sendSMS();}/*** 路由器产品接口*/
public interface IRouterProduct {/*** 开机*/void start();/*** 关机*/void shutdown();/*** 开启wifi*/void openWifi();/*** 设置参数*/void setting();}/*** 抽象产品工厂(定义了同一个产品族的产品生产行为)*/
public interface IProductFactory {/*** 生产手机* @return*/IPhoneProduct produceTelPhone();/*** 生产路由器* @return*/IRouterProduct produceRouter();
}
接下来看产品类:
/*** 华为手机产品*/
public class HuaweiPhone implements IPhoneProduct {@Overridepublic void start() {System.out.println("开启华为手机");}@Overridepublic void shutdown() {System.out.println("关闭华为手机");}@Overridepublic void callUp() {System.out.println("用华为手机打电话");}@Overridepublic void sendSMS() {System.out.println("用华为手机发短信");}
}/*** 华为路由器产品*/
public class HuaweiRouter implements IRouterProduct {@Overridepublic void start() {System.out.println("启动华为路由器");}@Overridepublic void shutdown() {System.out.println("关闭华为路由器");}@Overridepublic void openWifi() {System.out.println("打开华为路由器的wifi功能");}@Overridepublic void setting() {System.out.println("设置华为路由器参数");}
}/*** 小米手机产品*/
public class XiaomiPhone implements IPhoneProduct {@Overridepublic void start() {System.out.println("开启小米手机");}@Overridepublic void shutdown() {System.out.println("关闭小米手机");}@Overridepublic void callUp() {System.out.println("用小米手机打电话");}@Overridepublic void sendSMS() {System.out.println("用小米手机发短信");}
}/*** 小米路由器产品*/
public class XiaomiRouter implements IRouterProduct {@Overridepublic void start() {System.out.println("启动小米路由器");}@Overridepublic void shutdown() {System.out.println("关闭小米路由器");}@Overridepublic void openWifi() {System.out.println("打开小米路由器的wifi功能");}@Overridepublic void setting() {System.out.println("设置小米路由器参数");}
}
最后看产品工厂:
/*** 华为产品工厂*/
public class HuaweiProductFactory implements IProductFactory{@Overridepublic IPhoneProduct produceTelPhone() {System.out.println(">>>>>>生产华为手机");return new HuaweiPhone();}@Overridepublic IRouterProduct produceRouter() {System.out.println(">>>>>>生产华为路由器");return new HuaweiRouter();}@Overridepublic IComputer produceComput() {return null;}
}/*** 小米产品工厂*/
public class XiaomiProductFactory implements IProductFactory {@Overridepublic IPhoneProduct produceTelPhone() {System.out.println(">>>>>>生产小米手机");return new XiaomiPhone();}@Overridepublic IRouterProduct produceRouter() {System.out.println(">>>>>>生产小米路由器");return new XiaomiRouter();}@Overridepublic IComputer produceComput() {return null;}
}
测试类如下:
/*** 使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。*/
public class Test {public static void main(String[] args) {System.out.println("===================小米系列产品=================");//小米产品工厂实例IProductFactory xiaomiProductFactory = new XiaomiProductFactory();//生产小米路由器IRouterProduct xiaomiRouter = xiaomiProductFactory.produceRouter();xiaomiRouter.start();xiaomiRouter.setting();xiaomiRouter.openWifi();xiaomiRouter.shutdown();//生产小米手机IPhoneProduct xiaomiPhone = xiaomiProductFactory.produceTelPhone();xiaomiPhone.start();xiaomiPhone.callUp();xiaomiPhone.sendSMS();xiaomiPhone.shutdown();System.out.println("===================华为系列产品=================");//华为产品工厂实例IProductFactory huaweiProductFactory = new HuaweiProductFactory();//生产华为路由器IRouterProduct huaweiRouter = huaweiProductFactory.produceRouter();huaweiRouter.start();huaweiRouter.setting();huaweiRouter.openWifi();huaweiRouter.shutdown();//生产华为手机IPhoneProduct huaweiPhone = huaweiProductFactory.produceTelPhone();huaweiPhone.start();huaweiPhone.callUp();huaweiPhone.sendSMS();huaweiPhone.shutdown();}
}
测试结果如下:
===================小米系列产品================= >>>>>>生产小米路由器 启动小米路由器 设置小米路由器参数 打开小米路由器的wifi功能 关闭小米路由器 >>>>>>生产小米手机 开启小米手机 用小米手机打电话 用小米手机发短信 关闭小米手机 ===================华为系列产品================= >>>>>>生产华为路由器 启动华为路由器 设置华为路由器参数 打开华为路由器的wifi功能 关闭华为路由器 >>>>>>生产华为手机 开启华为手机 用华为手机打电话 用华为手机发短信 关闭华为手机
抽象工厂模式最早的应用是用于创建属于不同操作系统的视窗构件。如 java 的 AWT 中的 Button 和 Text 等构件在 Windows 和 UNIX 中的本地实现是不同的。
抽象工厂模式通常适用于以下场景:
抽象工厂模式的扩展有一定的“开闭原则”倾斜性:
另一方面,当系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。