模式是某种场合下对某个问题的一个解决方案的一种结构化展现。 —— Jon Vlissides(GoF 成员)《设计模式沉思录》
不过,人们对于设计模式的看法就变成了砒霜,听上去有害,实际上真香。
我不是想鼓励使用设计模式,只是呢,如开头所说,我想展示的是如何用它来提升代码的可读性。也因此,我们的第一个例子是,干掉反模式的设计模式。
一旦你决定使用某种设计模式的时候,请确保团队的所有人知道它解决了什么问题?
终止 Singleton
确保一个类只有一个实例,并提供一个全局访问点来访问该实例。—— 《设计模式:可复用面向对象软件的基础》
单例对象存活的时间通常很长,它们通常存在于程序的整个生命周期中。一个复杂应用可能有很多个单例,会使得上述问题更加严重。
整体来说它的缺点大过优点:
- 对单例类的依赖被硬编码到其他类中,对具体类的依赖性破坏了OO。
- 单例对接口不友好。
- 单例getInstance没有继承性。
- 多线程情况下有线程安全问题。
工厂封装复杂构建
工厂是领域驱动设计中的重要组件。
工厂的目标:
- 隐藏创建对象的复杂性
- 减少对外暴露过多的内部结构
工厂模式是一种创建方法:
- 工厂方法(factory method)
- 抽象工厂(abstracty factory)
- 建造者模式(builder)
值得注意的是:工厂并不总是需要独立的静态类。尝试使用 coca suggest
会有惊喜。
重构手法
对应的手法是:
- 提取构建步骤到新的构建方法中
- 将构建步骤方法转为 static 方法
- 将这个 static 方法移到工厂类中
- 将旧的构建函数提取成工厂方法
- 将提取的工厂方法移到类中
- 内联原有的工厂使用方
策略模式提供易变规则
我们需要把过程中的易变部分提取到模型的一个单独的『策略』对象中,将规则与它控制的行为分开。——《领域驱动设计:软件核心复杂性应对之道》
看标题,你懂的。
建造者模式拆解复杂对象
看标题,你懂的。
工具:自动化识别
如 Coca 提供的 coca suggest
功能,可以对相应的类提供一些建议,如:
CLASS | PATTERN | REASON |
---|---|---|
Insect | factory | too many constructor |
Bee | factory, builder | complex constructor, too many constructor, too many parameters |
下一节:理想的方法长度不应该超过 4 行代码。—— Robert C Martin