创建型模式(Creational Pattern)
对类的实例化过程的抽象化,提供对象的创建和管理职责。
创建型模式:
①单例模式
②工厂方法模式
③抽象工厂模式
④建造者模式
⑤原型模式
在Java中,单例模式的实现表现形式有:①饿汉式单例类:类加载,对象实例化;②懒汉式单例类:引用时即对象实例化。
看看恶汉式单例类的代码:
public class Singleton{
private static Singleton m_instance = new Singleton();
//让外界无法直接实例化
private Singleton(){
}
//获取实例对象
public static Singleton getInstance(){
return m_instance;
}
}
可以看出,类加载时,静态变量m_instance会被初始化,外部也无法直接创建Singleton对象,只能直接调用它的静态方法getInstance来得到其对象。这就实现了一个类被加载时,对象也就创建出来了,并且只有一个!
看看懒汉式单例类的代码:
public class Singleton{
private static Singleton _instance = null;
//让外界无法直接实例化
private Singleton(){
}
//同步,多线程下只能创建一个实例
synchronized public static Singleton getInstance(){
if(_instance == null){
_instance = new Singleton();
}
return _instance;
}
}
可以看出,懒汉式使用多线程环境下synchronized,这样每次只能实例化一个对象。
饿汉式与懒汉式的区别:
①:饿汉式是加载时实例花,懒汉式是引用时实例化;
②:饿汉式资源利用率较差,反应时间和和速度较好;
③:饿汉式易在java中实现,不易在c++中实现。
单例模式的优点:
①:减少内存开支;
②:减少系统性能开销;
③:避免对资源的多重占用;
④:优化和共享资源访问。
缺点:;
①:无法创建子类,扩展困难;
②:对测试不利;
③:单例模式与单一职责原则冲突。
什么时候使用单例模式?
a.要求生成唯一序列号的环境;
b.在项目中需要一个共享访问点或共享数据;
c.创建一个对象需要消耗的资源过多(IO、数据库);
d.需要大量定义静态常量和静态方法的环境。