软件构造 面向可维护性的设计模式
一、创造型的模式
1、工厂方法模式
定义一个用于创建对象的工厂接口,其子类型来决定创建对象时实例化哪一个类。模式如下,Product是一个对象,其有子类ProductOne、ProductTwo等,定义一个工厂接口Creator,其有工厂方法factoryMethod,这样就可以利用工厂方法去创建对象。不同的工厂方法实例化接口Product不同的子类,但返回的都是接口类型,即Product:
一个例子:
静态工厂就不用new了:
2、抽象工厂模式
提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体实现类。
具体形式如下,有多个产品类(下图的AbstractProductA、B等),其子类有固定的组合(例如ProductA1和ProductB1是固定组合),然后每一个抽象工厂类封装相应的一些产品子类在一起(例如ConcreteFactory1封装了ProductA1和ProductB1的组合)。当客户端需要使用一套产品时,可以通过相应的抽象工厂类去创建:
举个例子,下图是factory代码,其中AbstractWidgetFactory是抽象工厂接口,WidgetFactory1、2是抽象工厂子类,每个类中有不同产品的各自的工厂方法:
客户端代码如下,builder是一个辅助类,可以向他传入抽象工厂来构造一组对象:
二、结构模式
代理模式:
某个类不方便被client直接访问,故client通过一个proxy去访问这个类。有三种情况:远程代理(cache)、虚代理(延迟创建对象)、保护代理。
总体形式如下,由于访问RealSubject代价太高等原因,创建一个代理Proxy,通过委托机制去访问它:
举个例子,对于一个图片对象来说,每次创建一个对象都需要从磁盘读取,代价高昂,并且读取了不一定会使用:
使用一个proxy类,当需要使用的时候,才从磁盘读取:
三、行为模式
1、观察者模式
一种类似于“偶像-粉丝”的框架,可以维护一对多的关系。粉丝可以到偶像那注册,偶像维护一个粉丝的列表,偶像状态发生了变化(有动态)会通知所有粉丝。
形式如下图所示,一个Subject接口(抽象类),他维护他的观察者的列表,并且可以改变状态(setstate)、通知观察者(notify),一个Observer接口,它可以设置自己观察的对象、更新状态(由观察的对象notify的时候回调):
举个例子,下图是一个Subject,维护列表、通知观察者、设置状态等功能如下图:
下图是一个观察者子类,可以设置Subject、更新状态(由Subject回调):
2、访问者模式
将一个ADT与对ADT的操作(visit)分离开来,这样可以*更改对ADT的各种操作而不用影响ADT。
形式如下图,有一个Visitor接口,含有针对某ADT的所有子类的visit操作,其可以有多种子类代表对ADT的不同操作;ADT中有accept方法,用来接受别人对自己的操作,也可以通过accept选取不同种类的操作:
举个例子,下图是visitor相关类/接口,每个类中有分别对某一ADT的子类Book、Fruit的操作:
ADT如下,每个子类有accept方法,用来接受外部对自己的操作:
客户端如下,这样就可以实现对一系列不同类物品的遍历和操作:
上一篇: equals和==的区别