[DP] Factory Pattern
介绍
准备做一起设计模型的介绍,主要的参考是一本书:Design Patterns Elements of Reusable Object-Oriented Software 作者是4位作者,Erich,Richard,Ralph,John,也叫四人帮, GoF(Gang of Four)。
所有的模型都是基于一个目的:
Coding to interfaces, not implementation
第一期 工厂模式:一出职场喜剧 🎭
想知道为什么你的代码像混乱的办公室?让我给你讲个故事…
出场人物:
- 老板 👔:只会说中文,有很多文件要翻译
- 经理小F 🎯:聪明的中间人,了解每个人的技能
- 小黑 🔤:会英语和法语
- 小红 📝:会中文和英语
第一幕:混乱现场(没有工厂模式)
老板:(拿着法语文件,茫然四顾)“这个…谁会法语?小黑?小红?”
小红:”我不会法语,小黑会!”
老板:”小黑!翻译这份法语文件!”
小黑:(困惑)“你在说什么?”
小黑:(对小红)“老板说什么?”
小红:”他让你翻译法语文件。”
小黑:(对小红)“你和他说,我明白了。”
小红:(对老板)“他知道了。”
老板:(又拿出一份文件)“英文的呢?谁会英文?小红会吗?小黑也会?那…那给谁?”
老板:”还有葡萄牙语谁会?完全不知道要找谁…”
小红:”谁去招人?以后怎么分配工作?这感觉越来越乱了…”
老板:”#%@#&…“(彻底抓狂)*
第二幕:神奇的转变(有了工厂模式)
老板:”小F经理,翻译这份法语文件。”
小F默默递给小黑 ✨
老板:”小F经理,翻译这份英文文件。”
小F顺畅地交给小红 ✨
老板:”葡萄牙语谁会?去招人吧!”
小F招了个葡萄牙语专家,并设置好工作流程
老板:”小F经理,翻译这份葡萄牙语文件。”
小F递给新来的同事 ✨
魔法揭秘 ✨
工厂模式 = 聪明的经理
不再是所有人对所有人的混乱,而是:
- 统一接口 (经理小F)
- 自动分配 (经理知道谁会什么)
- 轻松扩展 (需要新技能?告诉经理就行!)
老板不需要知道谁会什么语言——他只要找小F经理,合适的人就会完成工作!
在代码中为什么有效 💻
❌ 没有工厂:你的代码到处直接创建对象
✅ 有了工厂:一个聪明的类处理所有对象创建
结果:更清洁、更灵活、更少让人头疼的代码!
工厂模式:因为你的代码也值得拥有一个好经理! 🎉
具体的例子
写一个画板程序,这个程序可以画圆形,长方形,三角形, 准备工作:
- 给圆形,长方形,三角形各写一个class。
- 不同形状画法不一样,每个class注入画的方法。
- 写一个画版Canvas的class,分别给给圆形,长方形,三角形创建一个对象,然后使用这三个工具画画吧。
Factory 方案
分析
-
Canvas的逻辑已经足够复杂了,不同形状画法的逻辑被完全的抽离,这样可以让Canvas这个class更加关注它自己的工作,代码管理更加有效。比如需要画圆的时候,调用shapeFactory.getShape(‘circle’).draw()即可。
-
添加新的形状(五角星),需要写一个新的五角星的class,然后在ShapeFactory里面注册这个class。
-
便于扩展,方便管理,画图软件里的画笔类型可以有成百上千种,添加新的类型可以基本不更改Canvas的代码。
-
Factory的扩展Abstract Factory Pattern
沿袭Factory Pattern的思路,形状有shapeFactory,颜色有ColorFactory,画笔有penFactory等等,这么多Factory本身也是同类型的东西,但是因为Factory的功能是不同的,用继承的思路并没有什么优势,所以一般的处理方法是通过添加一个抽象的class,其他的思路不变。
abstract class factory abstract Shape getShape; abstract Color getColor; abstract Pen getPen;