工厂模式之抽象工厂
前言
在简单工厂中我们解耦了对象创建职责和使用职责,将对象的创建分离到工厂类中,随之产生的问题是对象创建逻辑集中在一起并且越来越复杂,难以维护。为了解决这个问题,引入了抽象工厂的概念。即由抽象工厂统一对象创建行为,具体工厂负责创建每一种产品。在这种模式下,创建逻辑被分散到各个具体工厂中。但是问题又来了,随着产品的增多,工厂类和产品类成对增加。系统中增加了大量的类,导致系统越来越庞大和复杂,难以维护!
抽象工厂模式
前面提到的类数量激增问题是工厂方法模式的主要缺陷,那么有什么好的办法解决呢?在原来的工厂类中只存在一个或一组重载的对象创建方法,现在我们可以考虑将相关产品的创建放在一个工厂类中,这样一来工厂类的数量就会大大减少。什么是相关产品呢?这里要提一个产品族的概念。比如电脑相关的产品,有主机,显示器,键盘,鼠标。主机有很多品牌,显示器也有很多品牌,键盘鼠标同理。那么要生产一个电脑出来,就需要从这四个产品中各选一个品牌出来,这就是一个产品族。对应到工厂类就是具有产生这一组产品的方法。
简单代码示例:
/** *抽象产品 */ 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
抽象窗口工具包)。
思考
抽象工厂模式可以保证系统在同一时刻使用的是一组相关的对象,而且在系统中增加一组相关对象以及对应工厂无需修改原有代码,符合 开闭原则
,但是当修改产品族时不得不对抽象代码修改。所以抽象工厂模式适用于产品结构稳定的系统。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于