面向可维护性的设计模式
Creational patterns (关于如何创建类的新实例的模式)
工厂方法模式(Virtual Constructor)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过访问具体工厂的工厂方法newProduct()来创建产品。
具体工厂(Concrete Factory):主要是实现抽象工厂方法中的抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
优点:无需将特定应用程序的类绑定到代码
缺点:客户可能需要创建Creator的子类,以便他们可以创建特定的ConcreteProduct
抽象工厂模式
提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体类。
结构模式(Structural patterns)
代理模式
- 信息缓存(“Remote Proxy”)
代理对象是不同地址空间的一个本地代表
如果信息改变不是特别频繁会使用 - Standin替换着(“Virtual Proxy”)
Object由于太贵或者创造的代价昂贵无法下载
如果真正的对象无法通过途径去访问 - 存取控制(“Protection Proxy”)
代理对象对于真正的Object提供保护
Proxy和Adapter之间的对比:
Adapter:目的为消除不兼容,目的是B以客户端期望的统一的方式与A建立起联系。
Proxy:目的是隔离对复杂对象的访问,降低难度/代价,定位在“访问/使用行为”
行为模式
Observer
保证了从属状态和主状态必须一致,“粉丝”对“偶像”感兴趣,希望随时得知偶像的一举一动。粉丝到偶像那里注册,偶像一旦有新闻发生,就推送给已注册的粉丝。
vistor
visitor和各种对象之间的比较:
迭代器:以遍历的方式访问集合数据而无需暴露其内部表示,将“遍历”这项功能delegate到外部的iterator对象。
visitor:在特定的ADT上执行某种特定的操作,但该操作不在ADT内部实现,而是delegate到独立的visitor对象,客户端可灵活扩展/改变visitor的操作算法,而不影响ADT。
关于Strategy和visitor
而后则都是delegation建立两个对象的动态联系:
但是visitor强调的是外部定义某种对ADT的操作,该操作与ADT自身关系不大(只是访问ADT),故ADT内部只需要开放accept(visitor)即可,client通过它设定visitor操作并在外部调用。
而strategy则强调是对ADT内部某些要实现的功能的相应的算法的灵活替换。这些算法是ADT功能的重要组成部分,只不过是delegate到外部strategy类而已。
visitor是站在外部client的角度,灵活增加对ADT的各种不同操作,灵活增加对ADT的各种不同操作(哪怕ADT没实现该操作),strategy则是站在内部ADT的角度,灵活变化对其内部功能的不同配置。