单例模式
一、定义
保证一个类只有一个对象实例,并提供一个统一的访问方式。有以下三个特点:
- 此类只能有一个实例
- 此类需要自行创建这个实例
- 此类对整个系统提供这个实例
二、类图表示
三、实现
1、懒汉式
package pattern.creational.singleton.lazy;
public class Singleton {
private static Singleton instance;
private Singleton() {}
public synchronized static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
-
优点:
实例对象是在获取实例(getInstance)时才被初始化,不会浪费内存。
-
缺点:
getInstance方法使用了synchronized线程同步关键字,执行效率会降低。
2、饿汉式
package pattern.creational.singleton.hungry;
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {}
public static Singleton getInstance(){
return singleton;
}
}
-
优点:
getInstance方法没有线程同步synchronized关键字,执行效率高。
-
缺点:
在类初始化时就初始化了singleton实例对象,可能会产生内存的浪费。
3、双重检查
package pattern.creational.singleton.doublecheck;
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
四、使用
Singleton singleton = Singleton.getInstance();
五、适用场合
系统中某个类的对象实例只需要有一个的时候。