工厂模式之抽象工厂
前言
在简单工厂中我们解耦了对象创建职责和使用职责,将对象的创建分离到工厂类中,随之产生的问题是对象创建逻辑集中在一起并且越来越复杂,难以维护。为了解决这个问题,引入了抽象工厂的概念。即由抽象工厂统一对象创建行为,具体工厂负责创建每一种产品。在这种模式下,创建逻辑被分散到各个具体工厂中。但是问题又来了,随着产品的增多,工厂类和产品类成对增加。系统中增加了大量的类,导致系统越来越庞大和复杂,难以维护!
抽象工厂模式
前面提到的类数量激增问题是工厂方法模式的主要缺陷,那么有什么好的办法解决呢?在原来的工厂类中只存在一个或一组重载的对象创建方法,现在我们可以考虑将相关产品的创建放在一个工厂类中,这样一来工厂类的数量就会大大减少。什么是相关产品呢?这里要提一个产品族的概念。比如电脑相关的产品,有主机,显示器,键盘,鼠标。主机有很多品牌,显示器也有很多品牌,键盘鼠标同理。那么要生产一个电脑出来,就需要从这四个产品中各选一个品牌出来,这就是一个产品族。对应到工厂类就是具有产生这一组产品的方法。
简单代码示例:
/**
*抽象产品
*/
interface MainFrame {} //主机
interface Displayer {} //显示器
interface Keybord {} //键盘
interface Mouse {} //鼠标
/**
*抽象工厂
*/
interface Factory {
//主机
MainFrame getMainFrame();
//显示器
Displayer getDisplayer();
//键盘
Keybord getKeybord();
//鼠标
Mouse getMouse();
}
public static void main(String args[]) {
Factory lenovoFactory = new LenovoFactory(); //获取一个联想电脑工厂
//获取一组联想电脑组件,组成一台电脑
lenovoFactory.getMainFrame();
lenovoFactory.getDisplayer();
lenovoFactory.getKeybord();
lenovoFactory.getMouse();
//这里省略了具体产品实现和工厂类实现
}
总结
抽象工厂模式可以说是工厂方法模式在具体场景下的延伸。由于它提供了更为强大的工厂类并且具备较好的扩展性,在软件开发中得到了广泛的应用,尤其是在一些框架和 API
类库的设计中例如 AWT
(Java
抽象窗口工具包)。
思考
抽象工厂模式可以保证系统在同一时刻使用的是一组相关的对象,而且在系统中增加一组相关对象以及对应工厂无需修改原有代码,符合 开闭原则
,但是当修改产品族时不得不对抽象代码修改。所以抽象工厂模式适用于产品结构稳定的系统。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于