单例模式
<设计模式其实很简单>笔记
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
②代码:
public class Singleton {
rivate static Singleton singInstance;
private Singleton() {..} //私有话构造函数,对象只由类本身实例化
public static Singleton GetInstance(){
if(singInstance == null){
singInstance = new Singleton();
}
return singInstance;
}
}
/*如果单例模式在多线程中使用,那么要防止多个线程在接近的时间内同时进入到判断对象是否存在的代码, if(singInstance == null) ,不然会创建出多个对象,不是同一个。 可使用锁。*/
将代码修改如下:
public class Singleton {
static Lock lock = new ReentrantLock(); //锁
private static Singleton singInstance;
private Singleton() {..} //私有话构造函数,对象只由类本身实例化
public static Singleton GetInstance(){
lock.lock();
if(singInstance == null){
singInstance = new Singleton();
}
lock.unlock();
return singInstance;
}
}
可再做优化,不用在判断的时候都加锁
if(singInstance == null){
lock.lock();
if(singInstance == null){
singInstance = new Singleton();
}
lock.unlock();
}
③另外的东西:
其实通过全局变量也可以实现单例模式的效果,不过无法阻止一个类被多次实例化
//Jvm在第一次加载类时会先将所有静态变量初始化。
public class Instance{
private static Instance instance = new Instance(); //静态单例模式
public static Instance getInstance(){
return instance;
}
public static void main(String[] args){
Instance instanceA = Instance.getInstance();
Instance instanceB = Instance.getInstance();
System.out.println(instanceA==instanceB)
}
④优点:
对唯一的实例做出访问控制。
允许改变实例的数目(可通过计数)