JAVA 设计模式,抽象工厂

举报
二当家的白帽子 发表于 2021/08/20 12:47:47 2021/08/20
【摘要】 为什么要有设计模式?一个有价值的系统总是会因为需求的变化而变化,可能是原有需求的修改,也可能是新需求的增加。于是可怜的猿们就得修改原来的代码。好的架构和设计可以让我们的代码结构具有良好的扩展性,在满足需求变化的同时仅需要修改尽可能少的代码,可以将需求变化对原系统的影响降到很低。设计模式就是人们对于良性架构设计的经验总结。 抽象工厂模式的类图简单工厂模式:一个工厂只有一条生产线,并且这条生产...

为什么要有设计模式?

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


抽象工厂模式的类图

抽象工厂模式的类图

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

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

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


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

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产品。

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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。