设计模式-单件模式
定义:确保一个类只有一个实例,并提供全局访问节点。
public class Singleton {
//定义一个全局的静态对象
private static Singleton mSingleton = null;
//默认构造方法访问权限设置为Private,不提供外部范围
private Singleton(){
}
//定义Public的getInstance方法,提供唯一的外部访问接口
public static Singleton getInstance(){
if(mSingleton == null)
mSingleton = new Singleton();
return mSingleton;
}
}
通过以上代码我们就实现了单件模式,是不是非常简单呢?这样就可以让一个类提供唯一的对象。注意,如果你写的单件模式用于多线程中,这样的写法并不安全。那么我们应该怎么写呢?别急,马上为你揭晓。
public class Singleton {
//定义一个全局的静态对象
private static Singleton mSingleton = null;
//默认构造方法访问权限设置为Private,不提供外部范围
private Singleton(){
}
//定义Public的getInstance方法,提供唯一的外部访问接口
public static synchronized Singleton getInstance(){
if(mSingleton == null)
mSingleton = new Singleton();
return mSingleton;
}
}
仔细观察发现,我们只在getInstance方法中加入了synchronized关键字,这样迫使每一个线程访问此方法之前,要先等候别的线程离开。也就是说不会有两个或以上的线程同时访问这个方法,这个时候同步此方法就变得很累赘,也是不好的设计。还有改进的空间吗?
public class Singleton {
//定义一个全局的静态对象
private static Singleton mSingleton = new Singleton();
//默认构造方法访问权限设置为Private,不提供外部范围
private Singleton(){
}
//定义Public的getInstance方法,提供唯一的外部访问接口
public static Singleton getInstance(){
return mSingleton;
}
}
在静态初始化器中创建单件,这段代码保护了线程的安全,不就完美解决问题了吗?如果你不想在静态器中创建单件,那么接下来双重加锁的方法,可以为你提供良好解决办法。
public class Singleton {
// 定义一个全局的静态对象
private static volatile Singleton mSingleton = new Singleton();
// 默认构造方法访问权限设置为Private,不提供外部范围
private Singleton() {
}
// 定义Public的getInstance方法,提供唯一的外部访问接口
public static Singleton getInstance() {
if (mSingleton == null) {
synchronized (Singleton.class) {
if (mSingleton == null)
mSingleton = new Singleton();
}
}
return mSingleton;
}
}
浙公网安备 33010602011771号