- 创建模式
- 结构模式
- 行为模式
1.Factory Method 工厂方法
创建对象与使用对象责任分离。
1)简单工厂
2)工厂方法
3)抽象工厂
2.Builder 创建模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
局部创建
解耦过程和部件
3.Prototype 原型
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。
工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
clone:深度克隆
4.Singleton 单例
确保一个类只有一个实例。
使用场合:对资源的控制。eg 数据库连接池,系统参数配置,Java API 中的 Runtime, Calendar...
实现方式:
1)懒汉模式:
double-checked locking (DCL)--多线程资源可剥夺。
多个类加载器加载使单例可能失效。
2)非懒汉模式:推荐。
5.Adapter 适配器
将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份。
组合(composition)和继承(inheritance).
java不支持多继承,可用接口实现。
6.Bridge 桥接模式
将抽象和行为划分开来,各自独立,但能动态的结合。
7.Composite 组合
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
Composite比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。
首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件Component).
8.Decorator 装饰模式
动态给一个对象添加一些额外的职责。
eg,
1)IO: BufferedReader br = new BufferedReader(new FileReader(filename));
2)扩展awt、swing组件。
...
9.Facade 外观
为子系统中的一组接口提供一个一致的界面。
Facade一个典型应用就是数据库JDBC的应用。
10.Flyweight 享元模式
内部状态:intrinsic
外部状态:extrinsic
共享内部状态元,由Flyweight Factory(享元工厂)管理Flyweight Pool(元池)。
11.Proxy 代理模式
为其他对象提供一种代理以控制对这个对象的访问。
使用情况:
1)授权机制 不同级别的用户对同一对象拥有不同的访问权利。
2)某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动。
3)copy-on-write的优化方式
动态代理,eg:代理JDBC Connection,截取close方法,返回连接池(简单强大但耗资源)。
12.Observer 观察者模式
类似监听器,通过接口回调。
13.Memento 备忘机制
存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态。
可作历史记录,耗资源(如果可以结合享元模式节省开支)。
14.State 状态模式
使用状态模式前,客户端外界需要介入改变状态,而状态改变的实现是琐碎或复杂的。
使用状态模式后,客户端外界可以直接使用事件Event实现,根本不必关心该事件导致如何状态变化,这些是由状态机等内部实现。
这是一种Event-condition-State,状态模式封装了condition-State部分。
每个状态形成一个子类,每个状态只关心它的下一个可能状态,从而无形中形成了状态转换的规则。如果新的状态加入,只涉及它的前一个状态修改和定义。
状态转换有几个方法实现:一个在每个状态实现next(),指定下一个状态;还有一种方法,设定一个StateOwner,在StateOwner设定stateEnter状态进入和stateExit状态退出行为。
15.Command 命令模式
将命令封装在一个类中,然后用户(调用者)再对这个类进行操作。
使用Command模式的一个好理由还因为它能实现Undo功能,每个具体命令都可以记住它刚刚执行的动作,并且在需要时恢复。
16.Chain of Responsibility 职责链
简称CoR.
用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request。
CoR的优点:
因为无法预知来自外界的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。无疑这降低了类之间的耦合性。
缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成,当然也可以用树的概念优化。 在Java AWT1.0中,对于鼠标按键事情的处理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR。
扩展性差,因为在CoR中,一定要有一个统一的接口Handler,局限性就在这里。
与Command模式区别:
Command 模式需要事先协商客户端和服务器端的调用关系,比如 1 代表 start 2 代表 move 等,这些 都是封装在 request 中,到达服务器端再分解。
CoR 模式就无需这种事先约定,服务器端可以使用 CoR 模式进行客户端请求的猜测试验。
17.Template 模板模式
定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。
Java的抽象类本来就是Template模式。
18.Strategy 策略
定义一系列的算法,把这些算法一个个封装成单独的类。
19.Mediator 中介者
用一个中介对象来封装一系列关于对象交互行为。
为何使用Mediator?
各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性。
如何使用?
//首先 有一个接口,用来定义成员对象之间的交互联系方式:
public interface Mediator { }
//Meiator具体实现,真正实现交互操作的内容:
public class ConcreteMediator implements Mediator {
//假设当前有两个成员.
private C1 c1 = new C1();
private C2 c2 = new C2();
...
}
public abstract class Colleague {
private Mediator mediator;
public Mediator getMediator() {
return mediator;
}
public void setMediator( Mediator mediator ) {
this.mediator = mediator;
}
}
public class C1 extends Colleague{...}
public class C2 extends Colleague{...}
//每个成员都必须知道Mediator,并且和 Mediator联系,而不是和其他成员联系
//注意,c1与c2的Mediator必须是同一个。
20.Interpreter 解释器
定义语言的文法 ,并且建立一个解释器来解释该语言中的句子。
Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的。
21.Visitor 访问者模式
作用于某个对象群中各个对象的操作。它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作。
22.Iterator 迭代模式
为外部提供统一访问方法而不暴露内部数据结构。
参考:
http://www.uml.org.cn/sjms/sjms.asp
http://www.jdon.com/designpatterns