设计模式学习笔记(1)——单利模式
单例模式必须只有一个实例,并且提供一个全局访问方法。
解析经典单利模式实例:
1 package designPatterns; 2 3 public class Singleton { 4 5 //利用一个静态变量来记录类的唯一实例 6 7 private static Singleton uniqueInstance; 8 9 //声明私有构造器,只有本类可以调用该构造器 10 11 private Singleton(){} 12 13 //创建一个静态的方法获取实例对象 14 15 public static Singleton getSingletonObj(){ 16 17 if(uniqueInstance==null){ 18 19 uniqueInstance=new Singleton(); 20 21 } 22 23 return uniqueInstance; 24 25 } 26 27 }
解决多线程同步问题:
-
添加线程同步synchronize
例如:每次都进行同步效率较低,适用于较少适用对象场合
package designPatterns.singleton;
public class Singleton {
//利用一个静态变量来记录类的唯一实例
private static Singleton uniqueInstance;
//声明私有构造器,只有本类可以调用该构造器
private Singleton(){}
//创建一个静态的方法获取实例对象(synchronized多线程处理,保证只有一个实例)
public static synchronized Singleton getSingletonObj(){
if(uniqueInstance==null){
uniqueInstance=new Singleton();
}
return uniqueInstance;
}
}
2.创建急切单利模式:长时间占用内存(适用与频繁适用对象场合)
public class Singleton {
//利用一个静态变量来记录类的唯一实例
private static Singleton uniqueInstance=new Singleton();;
//声明私有构造器,只有本类可以调用该构造器
private Singleton(){}
//创建一个静态的方法获取实例对象(synchronized多线程处理,保证只有一个实例)
public static Singleton getSingletonObj(){
return uniqueInstance;
}
}
3.双重检查加锁:
例如:只有第一次创建对象的时候才进行同步(volatile只用于JDK4.0以上版本)
public class Singleton {
//利用一个静态变量来记录类的唯一实例
private static volatile Singleton uniqueInstance ;
//声明私有构造器,只有本类可以调用该构造器
private Singleton(){}
//创建一个静态的方法获取实例对象(synchronized多线程处理,保证只有一个实例)
public static Singleton getSingletonObj(){
if(uniqueInstance==null){
synchronized(Singleton.class){
uniqueInstance=new Singleton();
}
}
return uniqueInstance;
}
}