原文地址:http://blog.csdn.net/column/details/pattern.html?&page=1
创建型模式
- 单例模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
- 原型模式
单例模式
定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
饿汉式单例
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
懒汉式单例(线程安全)
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
简单地说:具体对象由具体的对象工长来创建。
抽象工厂模式
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式是工厂方法模式的升级。区别在于抽象工厂模式提供一组相关对象生产的接口方法,而工厂方法提供一个对象生产的接口方法。
UML类图是一致的。
无需纠结使用的是抽象工厂模式还是工厂方法模式,主要目的都是用来解耦。
建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
相对于工厂模式,建造者模式在最终调用者之间多了一个Director类。
Builder用来提供创建最终产品的各个零部件方法,Director用来确定组装各个零部件的顺序来产生最终的产品。具体Builder的实现持有一个最终产品的私有属性。
建造者模式和工厂模式非常相似,建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程。
原型模式
定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:
- 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
- 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。
使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。
在使用原型模式时,要注意深拷贝与浅拷贝的问题。