23种设计模式-单例模式
单例模式是23中设计模式中最简单的设计模式,也属于创建模式。顾名思义,就是为了保证该类的实例只能有一个。单例模式又分懒汉式,饿汉式,双重检测锁模式,枚举式,静态内部类式
下面逐一介绍。
饿汉式:
/**
* 测试饿汉式:天然的线程安全加载效率高
*
* @author Victor Djm
*
*/
public classSingletonDemo1 {
private static SingletonDemo1 instance =new SingletonDemo1();
private SingletonDemo1() {
}// 私有化构造器
public static SingletonDemo1getSingletonDemo1() {
returninstance;
}
}
总结:类加载时就创建该实例,效率高,但不支持懒加载。可能在不需要的情况下也创建
懒汉式:
/**
* 懒汉式:线程安全,加载效率低,使用时才去创建实例保证不浪费资源
*
* @author Administrator
*
*/
public classSingletonDemo2 {
private static SingletonDemo2 instance;
private SingletonDemo2() {
}
// 加上线程锁可以保证不会出现并发访问的问题如果不加可能会出现多次创建实例,导致违背单例模式
public static synchronized SingletonDemo2getSingletonDemo2() {
if (instance ==null) {
instance =new SingletonDemo2();
}
returninstance;
}
}
总结:懒汉式在第一次调用的时候才去创建对象。效率较低。但支持懒加载,不会创建多余的对象
/**
* 双重检查锁实现单例模式
* @author
*
*/
public classSingletonDemo3 {
privatestaticSingletonDemo3 instance =null;
publicstaticSingletonDemo3 getInstance() {
if(instance ==null){
SingletonDemo3 sc;
synchronized(SingletonDemo3.class){
sc = instance;
if (sc ==null) {
synchronized (SingletonDemo3.class) {
if(sc ==null) {
sc = new SingletonDemo3();
}
}
instance = sc;
}
}
}
returninstance;
}
privateSingletonDemo3() {
}
}
这种方式效率高,也支持懒加载,但是由于jvm底层不支持这种模式,最好不要使用。
枚举式:
/**
* 枚举式:天然单例
* @author Administrator
*
*/
public enumSingletonDemo4 {
Instance;
public SingletonDemo4getInstance() {
return Instance;
}
}
枚举式是天然单例的模式,效率高,基于jvm底层实现,天然单例
/***
* 静态内部类模式,
* @author Administrator
*
*/
public classSingletonDemo5 {
//通过静态内部类实现单例
public static class Instance {
private static SingletonDemo5 instance =new SingletonDemo5();
}
private SingletonDemo5() {
}
public static SingletonDemo5getInstance() {
return Instance.instance;
}
}
静态内部类式线程安全调用效率高,并且实现了延时加载。
总结:如果要使用懒加载,静态内部类模式好于懒汉式
如果不使用懒加载,枚举式好于饿汉式
不推荐使用双重检测锁模式。