创建型模式(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.需要大量定义静态常量和静态方法的环境。