单例模式
单例模式的使用原则:全局只需要一个实例,实例需要包含一定的属性(如果对象单纯用到方法,而没有属性,还不如全使用静态方法,连实例都可以不需要了)。
- 饿汉模式:类加载慢,获取实例速度快
- 懒汉模式:类加载快,获取实例速度慢
- 静态内部类:类加载快,获取实例速度快
饿汉模式
public class Singleton {
private String name;
private Singleton (){
name = "单例饿汉模式";
}
public static Singleton getInstance(){
return mSingleton;
}
private String getName(){
return name;
}
}
//使用单例
public void test(){
System.out.println(Singleton.getInstance().getName());
}
懒汉模式
public class Singleton {
private String name;
private static Singleton mSingleton;
private Singleton() {
name = "单例懒汉模式";
}
public static Singleton getInstance() {
if (mSingleton == null) {
mSingleton = new Singleton();
}
return mSingleton;
}
}
//使用单例
public void test(){
System.out.println(Singleton.getInstance().getName());
}
静态内部类
public class Singleton {
private String name;
public static class IN {
static final Singleton instance = new Singleton();
}
private Singleton() {
name = "单例懒汉模式";
}
public static Singleton getInstance() {
return IN.instance;
}
}
注意
饿汉模式线程安全的,懒汉模式非线程安全,因为在判断单例是否存在的时候,可能一个线程在创建实例的时候,另一个线程也判断不存在,也在创建,造成了对象的不唯一,修改设计如下:
public class Singleton {
private String name;
private static volatile Singleton mSingleton;
private Singleton() {
name = "单例懒汉模式";
}
public static Singleton getInstance() {
if (mSingleton == null) {
synchronized (Singleton.class) {
if (mSingleton == null) {
mSingleton = new Singleton();
}
}
}
return mSingleton;
}
}