JAVA设计模式-创建模式-工厂模式-抽象工厂

为什么要有设计模式?

一个有价值的系统总是会因为需求的变化而变化,可能是原有需求的修改,也可能是新需求的增加。于是可怜的猿们就得修改原来的代码。好的架构和设计可以让我们的代码结构具有良好的扩展性,在满足需求变化的同时仅需要修改尽可能少的代码,可以将需求变化对原系统的影响降到很低。设计模式就是人们对于良性架构设计的经验总结。

抽象工厂模式的类图

抽象工厂模式的类图
简单工厂模式:一个工厂只有一条生产线,并且这条生产线生产所有种类的具体产品。

工厂方法模式:一个工厂也是只有一条生产线,但是这条生产线只生产一种具体产品。

抽象工厂模式:才更像是我们生活中的工厂,一个工厂有多条生产线,每条生产线生产一种具体产品。不同工厂生产不同品牌的相同功能产品。

为什么要有抽象工厂模式?

AWT结构
这个问题我觉得用JDK中的例子来谈是最合适的。在JDK中有一个AWT包,里面有Button,TextField等是用来实现GUI的功能。JAVA有一句口号是一处编写到处运行。这意味着,我们用JAVA编写GUI/图形用户界面的程序,不需要考虑是用的什么平台/操作系统。所以必须要有统一的接口和继承结构给普通用户使用,JDK使用一个叫Peer的结构来适配不同平台。对于我们使用的Button,Text都有对应的ButtonPeer和TextFieldPeer。然后使用Toolkit作为桥梁,当我们的GUI程序运行到与平台有关的代码就由Toolkit去调用Peer结构的代码,这也就意味着Peer在每个平台的实现是不同的。而每个平台仅仅需要对应于那个平台的Peer,比如我在Linux运行就仅仅需要Linux的Peer实现,而不需要Windows的。在安装JDK时我们选择了相应平台的JDK,每个平台的JDK中只有对应平台的Peer实现。
Toolkit
Toolkit
比如我编写程序要实例化一个按钮Button,然后Button就委托Toolkit这个工厂去生产一个对应的ButtonPeer。

产品等级结构与产品族

产品等级结构
产品族
产品等级结构和产品族
在我们编写GUI时我们会用到Button,Text等,这就是两个产品等级结构。
对于Button有Windows的WinButton,Unix的UnixButton。
对于Text有Windows的WinText,Unix的UnixText。
Windows和Unix就是两个产品族。对于Windows产品族就包含了WinButton和WinText产品。对于Unix产品族就包含了UnixButton和UnixText产品。

产品等级结构和产品族是不同的维度。如果一个系统通常会使用一个产品族的不同产品时,就可以考虑使用抽象工厂模式。既隔离了相同等级结构,不同产品族产品的生产。又将相同产品族,不同等级结构产品的生产放在了一起。即通常会生产不同的产品,但是只是用到一个工厂。

鸣谢

非常感谢你花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,欢迎指正。欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

关联文章

简单工厂模式
工厂方法模式

猜你喜欢

转载自blog.csdn.net/leyi520/article/details/106881144