一个模式是……
软件开发中重复出现问题的解决方案
1. Singleton(单件) Pattern
意图:保证一个类只有一个实例,并且提供一个访问他的
全局访问点。
例如,美国总统的任期就是一个Singleton模式的例子,因为在每段任期内只能有一个总统。而且不论谁是总统,“美国总统”的称号都是指向某个特定的个人。
2.Factory Method
(工厂方法,虚构造器
n 意图:定义一个创建对象的接口,让子类决定实例化哪个类。 Factory Method使一个类的实例化延迟到其子类。
n 例如,在铸造成型的过程中,制造者首先将塑料加工成可成型的粉末,然后将塑料粉末注入到需要的模具中。在Factory Method模式中,子类 (在这里就是指模具)来决定需要实例化那个类。在这个例子中,ToyHorseMold类就是被实例化的类。
3.Abstract Factory(抽象工厂
意图:提供一个创建一系列相关或者相互依赖对象的接口,
不要指定它们的具体类。
例如,
在汽车制造中,金属片冲压设备是Abstract Factory模式的
一个例子,它用来制造汽车的部件。用滚筒(rollers)来改变
模具(dies),就可以改变这样的具体对象(模具的加工品)。
这些具体的对象包括:引擎罩、车的中轴、车顶、左右的前
端挡板等。汽车的主控部分要确保所有这些具体的对象都是
兼容的。
4.Builder(生成器)
n 意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示结果。
n 例如,快餐店用Builder模式来制作专门针对儿童的快餐。由于儿童的口味五花八门,因此菜单内容也需要经常变化(例如:主食、饮料、或者玩具等),尽管如此,制作儿童快餐的过程是不变的。注意:Builder和Abstract Factory模式的差异,Builder返回的是完成的产品,而Abstract Factory返回的是一组相关的部分。
5.Prototype(原型)
n 意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
n 例如,一个细胞核的分裂可以生成两个同样基因型的细胞。而细胞的“克隆”就是Prototype模式的一个例子。源细胞在这里作为一个主动的角色(active role),创建它自己的新实例。
6.Adapter(适配器)
n 意图:将一个类的接口转换成用户希望的另一个接口。使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作。
n 例如,一个1/2英寸的防倒转齿轮不可能和一个1/4英寸的插槽配合工作。使用Adapter模式,阴口和1/2英寸的防倒转齿轮接合,阳口和1/4英寸的插槽接合。这样两个部件就能够顺利工作。
7.Flyweight(享元)
n 意图:利用共享技术有效地支持大量细粒度的对象。
n 例如,大多数打电话者都不知道音频发生器(比如:拨号音、忙音、或记录音)池的数目比打电话人的数目少得多。而拨号音发生器就是Flyweight模式的一个例子。 电信上网IP地址
8.Façade (统一外部界面)
意图:为系统中的一组接口提供一个一致的界面;
定义一个高层接口,这个接口使得这一系统或者子
系统更加容易使用。
例如,
救护服务中心包括针对不同救护目的仪器设备。例如:
针对不同的救护等级,需要配置不同的设备和技术要求
的人员,儿科救护,直升飞机等。另一方面,需要救护
的人员必须很容易的使用救护系统,即:播打求助热线
9.Composite(组合) Pattern
意图:将对象组合成树形结构以表示“部分-整体”的层次结构。
Composite使得用户对单个对象和组合对象的使用具有一致性。
例如,算术表达式能够用树结构来表示,其中操作数可以是一
个数字或者一个算术表达式。如果我们把单个对象(数字),和
单个对象的组合(子数学表达式)同等地对待,这个算术表达式
就是一个Composite模式的例子。
10.Decorator(装饰)
n 意图:动态地给一个对象添加一些额外的职责。
n 例如,绘画作品可以带画框或者不带画框地挂在墙上。通常,我们都是把画镶边,配上画框后再挂到墙上。这里,画、画框、和镶边构成了一个可视的构件。
11.Proxy(代理)
n 意图:为其它对象提供一种代理以控制这个对象的访问。
n 如旅行社。
12.Bridge(桥接)
n 意图:将抽象部分与它的实现部分分开,使它们都可以独立变化。
n 例如,开关是用来控制灯泡、吊扇、垃圾处理器等各种设备的打开和闭合,通过使用Bridge模式,我们可以将开关的具体实现和抽象的开关类分离开来。
n 行为协调:abstraction将Client的请求发给它的Implementor。
13.Observer(观察者) Pattern
意图:定义对象间的一对多的依赖关系,当一个对象的状态
发生改变时,所有依赖于它的对象都得到通知并被自动更新。
例如,注册了某公司产品质量保证书的客户就象投标人
(observers)。当该产品的安全记录发生改变时(例如需要召回
产品时),所有注册的客户都将被通知。
14. State(状态) Pattern
意图:允许一个对象在其内部状态改变时改变它的行为。对象看
起来似乎修改了它的类。分离状态与状态改变的处理行为。
例如,自动售货机的行为会根据它所处的状态而不断变化。比如说:已经投入售货机的钱、可选货物清单、用户的选择、和售货机里所剩的用于找零的硬币,等等都属于售货机状态的一部分
15. Chain of Responsibility
意图:使多个对象都有机会处理请求,从而避免请求的发送者
和接收者之间的耦合关系。将这些对象连成一条链,并沿着这
条链传递该请求,直到有一个对象处理它为止。
例如,
一个依靠机械装置来对硬币进行分类的银行用一个单独的投币
口管理所有的硬币。当一个硬币被扔进来时,
Chain of Responsibility决定了哪个管道容纳哪种硬币。如果一
个管道不能容纳这个硬币,这个硬币将被传递到下一个管道,
直到它被接受为止。
行为协调:
• 当客户提交一个请求时,请求沿链传递直至有一个
ConcreteHandler对象负责处理它。
16. Strategy(策略) Pattern
意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
例如,传真、夜里到达的邮件、航空邮件、水陆路邮件都是将信件从一个地方传递到另外一个地方,但是使用了不同的传递方式。
18. Interpreter
n 意图:给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的例子。
n 例如,音符为表示声音的声调和长度提供一套文法表示方式。当音乐家按照乐谱演奏时,他们就是Interpreters,翻译音符的文法。
19.Iterator(迭代器,游标)
n 意图:提供一种方法,顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。
n 例如,现代电视机中的频道选择器就是Iterator模式的一个例子。选择频道时,并不是在电视机控制面板上标示出所有的频道,例如一个按钮对应一个频道
20.Mediator(中介者)
n 意图:用一个中介对象来封装一系列对象的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
n 例如,机场的控制塔为停靠在机场内的飞机提供了一个中心的信息交换点,并且它负责管理机场的空域范围。作为中心化的信息交换点和空域范围的约束管理者,控制塔就是一个Mediator。
21.Memento(备忘录)
n 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可以将该对象恢复到原先保存的状态。
n 例如,对音频混频器来说,它可以有无限数量的声音设置。而技术员可以通过照相的方式来记录某个特殊的设置,并且用这张照片还原到原来的设置状态。
22.Template Method(模板方法
n 意图:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。它使得子类可以不改变一个算法的结构而可重新定义该算法的某些特定的步骤。
n 例如,房屋建造者经常使用(Template Method)模式,基于有限数量的建筑平面图来设计各种各样的房屋模型。而基本的建筑平面图只是一个骨架,各种不同的房屋模型之间的差别只有在最后的建造阶段才体现出来。
23.Visitor(访问者)
n 意图:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
n 例如,
一个外来的顾问进入公司的某个部门,并和该部门的每位员工单独见面,就是一个Visitor例子。当visitor被陪同进入每个小办公间时,他们什么都不作。一旦他们进入了小办公间,他们就会马上对员工进行面试(发送消息并得到结果)。