【读书活动感悟分享】—模式冲锋号—《设计模式:可复用面向对象软件的基础》工厂与构造者模式读后感_话题

【读书活动感悟分享】—模式冲锋号—《设计模式:可复用面向对象软件的基础》工厂与构造者模式读后感

2025-11-14 21:33:38
0
106

1.方法使用场景
1.1工厂方法
想象一个比萨店(PizzaStore)。总店定义了制作比萨的流程(orderPizza),比如准备、烘焙、切割、装盒。但总店不关心每个地区的人喜欢吃什么口味的比萨。因此,它把“创建比萨”这个步骤抽象出来,变成一个工厂方法 createPizza()。
北京的加盟店(BeijingPizzaStore)重写这个工厂方法,返回 BeijingSpicyPizza。
上海的加盟店(ShanghaiPizzaStore)也重写这个方法,返回 ShanghaiSweetPizza。
这样,当客户在北京店下单时,流程走的是总店的,但最终吃到的是符合北京人口味的比萨。增加一个新口味的比萨,只需新开一家店(新的子类),而无需修改总店的流程。

1.2抽象工厂
现在我们要为一套智能家居系统设计UI。这套系统需要支持不同的视觉主题,比如“现代简约风”和“复古机械风”。
ModernThemeFactory(现代风工厂)会生产:
ModernButton, ModernScrollBar, ModernWindow。

RetroThemeFactory(复古风工厂)会生产:
RetroButton, RetroScrollBar, RetroWindow。

你的应用程序代码并不需要知道具体创建的是哪个按钮或滚动条。它只需要知道当前使用的是哪个“主题工厂”,然后向这个工厂要按钮、要滚动条。这个工厂会确保返回给你的所有UI部件都是同一种风格的,完美搭配。

1.3构造者模式
我们要生成一份RTF(富文本)文档,并希望它能被转换成纯文本、TeX格式或一个可视化的文本编辑组件。
如果我们把解析RTF和转换格式的逻辑混在一起,代码会非常臃肿且难以维护。构造者模式提供了一个优雅的解决方案:

RTFReader(导演者):它只负责按规则解析RTF文档。每当它识别出一个RTF标记(如普通文本、加粗、斜体),它就通知一个“转换器”。
TextConverter(构造者接口):它定义了如何处理各种标记的接口。
ASCIIConverter, TeXConverter, TextWidgetConverter(具体构造者):它们分别实现这些接口,来构建自己格式的最终产品(纯文本字符串、TeX代码、一个文本窗口组件)。
RTFReader 不知道也不关心最终产品是什么样,它只是机械地解析并发出指令。而不同的 Converter 则负责将这些指令翻译成自己领域的“语言”,最终构建出完全不同的表示。

2.价值
2.1工厂方法
工厂方法将对象的创建和使用分离,让系统更符合“开闭原则”——对扩展开放,对修改关闭。它是框架设计中常用的技巧,让框架能灵活地适应未来的变化。
2.2抽象工厂
抽象工厂强调的是一个产品家族的概念。它保证了从一个工厂出来的系列产品是兼容的、风格一致的。当你需要切换整个产品系列时(比如从现代风切换到复古风),只需要换一个工厂对象,所有创建的部件都会自动切换,非常方便。
2.3构造者模式
构造者模式将一个复杂对象的构建过程和它的最终表示彻底分离。这使得同样的构建过程可以创造出不同的产品,并且让你能更精细地控制构建的每一步。它特别适合构建那些需要通过多个步骤、且可能有很多配置选项的复杂对象。


3.总结与对比
这三种模式都服务于“如何更好地创建对象”这一核心目标,但侧重点不同:


简单来说:
当纠结于“我该创建哪个单一对象”时,想想工厂方法。
当需要确保“这一整套对象都得是同一个系列的”时,想想抽象工厂。
当面对一个“需要很多步骤才能组装好,而且最终形态可能千差万别”的复杂对象时,想想构造者模式。



分享者: 续宇翔
评论


意见反馈