本文仅是记录理解,所有内容均来自如下地址(未完待续):
http://c.biancheng.net/design_pattern/
根据目的性(完成什么工作)
创建型模式:描述怎么创建对象,主要特点为将对象的创建与使用分离,如单例、原型、工厂方法、抽象工厂和建造者等
结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,如代理、适配器、桥接、装饰、外观、享元和组合等
行为型模式:用于描述类或对象之间如何相互协作共同完成单个对象都无法完成的任务,及如何分配职责,如模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录和解释器。
根据作用范围(是类还是对象)
- 类模式 ,处理类与子类的关系,通过继承建立,是静态的,在编译阶段便确定下来,包括:工厂方法,类适配器,模板方法和解释器;
2.对象模式 处理对象之间的关系这些关系可通过组合或聚合实现,动态的,除上述4种,其余全为对象模式;
23种设计模式介绍
单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
单例模式的几个典型使用场景是:打印机队列,显卡驱动程序,应用程序日志对象,对话框,系统中的缓存等,这些场景为保持应用的数据唯一性,不允许多实例的存在。
特点:只有一个实例对象;必须由单例类自行创建;对外提供一个全局访问点。
通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。
其实现有两种方式:懒汉式和饿汉式
懒汉式示例代码
public class LazySingleton
{
private static volatile LazySingleton instance = null; //保证instance在所有线程中同步
private LazySingleton(){} //private避免类在外部被实例化
public static synchronized LazySingleton getInstance()
{
//getInstance方法前加同步
if(instance = null)
{
instance = new LazySingleton();
}
return instance;
}
}
如果编写的是多线程程序,则不要删除上例代码中的关键字 volatile 和 synchronized,否则将存在线程非安全的问题。如果不删除这两个关键字就能保证线程安全,但是每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。
饿汉式示例代码
类一旦加载就创建一个单例,保证在调用getInstance方法前单例已经存在
public class HungrySingelton
{
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton(){};
pubilic static HungrySingleton getInstance()
{
return instance;
}
}
饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题.
原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
在有些系统中,存在大量相同或相似的对象的创建问题,若用传统的构造函数来创建会比较复杂且耗时耗资源,用原型模式生成对象就很高效。
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建对象的种类。用这种方式创建对象很高效,根本不用关心对象创建的细节。
由于Java提供了对象的clone()方法,所以用Java实现原型模式很简单。
原型模式主要包括以下角色:
1.抽象原型类:规定了具体原型对象必须实现的接口。
2.具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
3.访问类:使用具体原型类中的 clone() 方法来复制新的对象。
工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。
外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。
观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。