6.2 面向可维护性的设计模式
1. 关于如何“创建类的新实例”的模式
1.1 工厂方法模式
- 工厂方法又叫抽象构造器
- 用工厂方法模式的场景:
- 当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法
- 定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类
1.2 抽象工厂模式
1.3 builder模式
- 用户去创建一个很复杂的对象,这个复杂对象内部包含很多组成部分,但用户无需知道这些组成部分的构造,用户只需调用一次构造函数,即可得到所有的组件
- 和工厂模式的区别就在于用户是否需要这个复杂系统内的每一个具体组件
- 抽象工厂:创建的不是一个完整产品,而是“产品族”(遵循固定搭配规则的多类产品实例),得到的结果是:多个不同产品的实例object,各产品创建过程对client可见,但“搭配”不能改变。
- builder:创建的是一个完整的产品,有多个部分组成,client不需了解每个部分是怎么创建、各个部分怎么组合,最终得到一个产品的完整object
2. 结构化模式
2.1 桥接模式
- Bridge是OOP最基本的structural pattern,通过delegation+inheritance建立两个具体类之间的关系(DIP依赖转置,抽象依赖于抽象)
2.2 代理模式
- 某个对象比较“敏感”/“私密”/“贵重”,不希望被client直接访问到,故设置proxy,在二者之间建立防火墙
- 代理模式和适配模式的区别:
- adapter:目的:消除不兼容,目的是B以客户端期望的统一的方式与A建立起联系
- proxy:目的:隔离对复杂对象的访问,降低难度/代价,定位在“访问/使用行为”
2.3 组合模式
3. 行为化模式
3.1 观察者模式
3.2 拜访者模式
- 对特定类型的object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类
- 本质上:将数据和作用于数据上的某种/些特定操作分离开来
- 为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变ADT本身的情况下通过delegation接入ADT