工厂设计模式可分为:
简单工厂模式
工厂方法模式
抽象工厂模式
第三篇我们来聊聊
抽象工厂模式
最近想学习一些设计模式的知识,所以在网上参考了一些文章和例子,为了尊重原创,这里先感谢原创作者的辛苦付出,如对原创作者造成不利的影响,请联系本人博客。
晨鸣的博客
理解
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。
光看定义相信大部分小伙伴跟我一样是一脸懵逼,与简单工厂或工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。
如上图所示,我们之前学习的简单工厂模式及工厂方法模式解决的都只是一种产品的创建过程,而在现实中,一个工厂往往不仅仅生产一种产品,例如惠普的工厂可能同时生产打印机、洗衣机、冰箱等产品,这里我们就需要对于一个产品族创建一个抽象工厂,在这个在具体的某一个产品族的工厂中创建具体的产品。
例子
Sunny软件公司欲推出一款新的手机游戏软件,该软件能够支持Symbian、Android和Windows Mobile等多个智能手机操作系统平台,针对不同的手机操作系统,该游戏软件提供了不同的游戏操作控制(OperationController)类和游戏界面控制(InterfaceController)类,并提供相应的工厂类来封装这些类的初始化过程。软件要求具有较好的扩展性以支持新的操作系统平台,为了满足上述需求,试采用抽象工厂模式对其进行设计。
根据抽象工厂模式定义设计结构图如下
根据需求我们知道,当该游戏在不同的操作系统时,需要分别使用不同的操作控制器和界面控制器,所以我们针对不同操作系统设计一个抽象工厂,该抽象工厂中定义两个方法,分别生产操作控制器和界面控制器。然后生产不同系统的工厂类,在工厂类中生成对应的操作控制器和界面控制器。
例子(摘自晨鸣的博客)
操作控制器代码
//操作控制器接口
public interface OperationController {
void controlOperation();
}
//生产三种操作控制器接口
public class SymbianOperationController implements OperationController {
@Override
public void controlOperation() {
System.out.println("使用Symbian系统操作控制");
}
}
public class AndroidOperationController implements OperationController {
@Override
public void controlOperation() {
System.out.println("使用Android系统操作控制");
}
}
public class WindowsOperationController implements OperationController {
@Override
public void controlOperation() {
System.out.println("使用Windows Mobile系统操作控制");
}
}
界面控制器代码
//界面控制器接口
public interface InterfaceController {
void controlInterface();
}
//分别生成三种界面控制器
public class SymbianInterfaceController implements InterfaceController {
@Override
public void controlInterface() {
System.out.println("使用Symbian系统游戏界面控制");
}
}
public class AndroidInterfaceController implements InterfaceController {
@Override
public void controlInterface() {
System.out.println("使用Android系统游戏界面控制");
}
}
public class WindowsInterfaceController implements InterfaceController {
@Override
public void controlInterface() {
System.out.println("使用Windows Mobile系统游戏界面控制");
}
}
抽象工厂代码
//抽象工厂接口
public interface SysFactory {
InterfaceController createInterface();
OperationController createOperation();
}
//生产三种不同系统的抽象工厂
public class SymbianSysFactory implements SysFactory {
@Override
public InterfaceController createInterface() {
return new SymbianInterfaceController();
}
@Override
public OperationController createOperation() {
return new SymbianOperationController();
}
}
public class AndroidSysFactory implements SysFactory {
@Override
public InterfaceController createInterface() {
return new AndroidInterfaceController();
}
@Override
public OperationController createOperation() {
return new AndroidOperationController();
}
}
public class WindowsSysFactory implements SysFactory {
@Override
public InterfaceController createInterface() {
return new WindowsInterfaceController();
}
@Override
public OperationController createOperation() {
return new WindowsOperationController();
}
}
客户端测试代码
public class Client {
public static void main(String[] args) {
SysFactory sysFactory;
InterfaceController interfaceController;
OperationController operationController;
sysFactory = new SymbianSysFactory();
interfaceController = sysFactory.createInterface();
operationController = sysFactory.createOperation();
interfaceController.controlInterface();
operationController.controlOperation();
}
}
测试结果如下
使用Symbian系统游戏界面控制
使用Symbian系统操作控制
当我们需要切换不同的操作系统时,只需要修改
sysFactory = new AndroidSysFactory();
结果就是
使用Android系统游戏界面控制
使用Android系统操作控制
小结
抽象工厂模式是对工厂方法模式的进一步升级使用,使得工厂方式更符合实际开发需求,在实际开发中往往需要一个产品族来完成工作。抽象工厂模式在新增产品族时很方便,无需修改已有系统,符合“开闭原则”。但抽象工厂模式最大的缺点是对于新增产品很麻烦,需要对原有系统进行较大的修改,不符合“开闭原则”。所以在实际开发中,我们需要衡量具体的需求,选择对应的设计模式,对于需要客户端使用同一产品族的需求时,可以选择抽象工厂模式进行设计。