介绍

准备做一起设计模型的介绍,主要的参考是一本书: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经理,合适的人就会完成工作!

在代码中为什么有效 💻

❌ 没有工厂:你的代码到处直接创建对象
✅ 有了工厂:一个聪明的类处理所有对象创建

结果:更清洁、更灵活、更少让人头疼的代码!

工厂模式:因为你的代码也值得拥有一个好经理! 🎉

具体的例子

写一个画板程序,这个程序可以画圆形,长方形,三角形, 准备工作:

  1. 给圆形,长方形,三角形各写一个class。
  2. 不同形状画法不一样,每个class注入画的方法。
  3. 写一个画版Canvas的class,分别给给圆形,长方形,三角形创建一个对象,然后使用这三个工具画画吧。

Factory 方案

Factory

分析

  1. Canvas的逻辑已经足够复杂了,不同形状画法的逻辑被完全的抽离,这样可以让Canvas这个class更加关注它自己的工作,代码管理更加有效。比如需要画圆的时候,调用shapeFactory.getShape(‘circle’).draw()即可。

  2. 添加新的形状(五角星),需要写一个新的五角星的class,然后在ShapeFactory里面注册这个class。

  3. 便于扩展,方便管理,画图软件里的画笔类型可以有成百上千种,添加新的类型可以基本不更改Canvas的代码。

  4. Factory的扩展Abstract Factory Pattern

    沿袭Factory Pattern的思路,形状有shapeFactory,颜色有ColorFactory,画笔有penFactory等等,这么多Factory本身也是同类型的东西,但是因为Factory的功能是不同的,用继承的思路并没有什么优势,所以一般的处理方法是通过添加一个抽象的class,其他的思路不变。

     abstract class factory
       abstract Shape getShape;
       abstract Color getColor;
       abstract Pen getPen;