天天看點

設計模式GOF23之單例模式實作

package com.bjsxt.cn.singleton;
/**
 * 餓漢式建立單例模型
 * 餓漢式單例模型的特點:
 *  1, 私有的該類對象靜态屬性
 *  2, 私有的構造器
 *  3, 公共的靜态方法通路靜态屬性(是以需要時靜态的環境)
 * @author wanna
 *
 */
public class SingletonDemo1 {
 //餓漢式,餓,非常餓,上來就吃了
 //類初始化的時候,立即加載這個對象(沒有延時加載的能力)。如果加載該類非常複雜,而在之後卻又并沒有通路該對象,造成資源的狼糞
 //由于加載類是天然線程安全的,是以餓漢式單例模式線程安全
 private static SingletonDemo1 instance = new SingletonDemo1();
 
 private SingletonDemo1() {
 
 }
 
 //該通路方法沒有同步synchronized,是以調用效率高
 public static SingletonDemo1 getInstance() {
  return instance;      
 }
}      
package com.bjsxt.cn.singleton;
/**
 * 2015年3月26日22:14:30
 * 懶漢式單例模式
 * 該懶漢式的特點是:
 *  1, 構造器私有
 *  2, 私有靜态屬性,類型為該類的對象,但是在聲明時并沒有初始化。因為Lazy load。因為懶惰
 *  3, 靜态通路私有的那個靜态屬性的靜态方法。但是在該方法體中先要檢查該靜态屬性是否為空,為空則new,否則直接傳回
 * 
 * @author wanna
 *
 */
public class SingletonDemo2 {
 private SingletonDemo2() {
  
 }
 
 private static SingletonDemo2 instance;
 
 //因為該方法加了同步synchronized,效率低,但是具有延時加載的能力。提高了資源的使用率
 public static synchronized SingletonDemo2 getInstance() {
  if (instance == null) {
   instance = new SingletonDemo2();
  }
  return instance;
  
 }
}      
package com.bjsxt.cn.singleton;
/**
 * 2015年3月26日22:14:38
 * 
 * 測試雙重檢測鎖式單例模式
 * 雙重檢測鎖式單例模式的特點與懶漢式相似,但最重要的差別是在通路靜态屬性的執行個體時的過程
 * 
 * 但是由于編譯器底層優化和JVM内部模型,偶爾會出問題,不建議使用
 * @author wanna
 *
 */
public class SingletonDemo3 {
 private static SingletonDemo3 instance = null;
 
 private SingletonDemo3() {
  
 }
 
 //該方法把懶漢式單例模式中的synchronized同步下移到if中,提高了執行效率,不用每次擷取對象時都需要進行同步。
 //隻有第一次建立需要同步,之後就不需要了。
 public static SingletonDemo3 getInstance() {
  if (instance == null) {
   SingletonDemo3 sc;
   synchronized(SingletonDemo3.class) {
    sc = instance;
    if (sc == null) {
     synchronized(SingletonDemo3.class) {
      if (sc == null) {
       sc = new SingletonDemo3();
       
      }
      
     }
     instance = sc;
    }
   }
  }
  return instance;
  
 }
}
      
package com.bjsxt.cn.singleton;
/**
 * 2015年3月26日22:14:45
 * 靜态内部類實作單例模式
 * 這種方式線程安全,執行效率高,并且可以延時加載
 * 特點:
 *  1, 構造器私有
 *  2, 靜态屬性修改為靜态内部類,在内部類中定義了外部類的靜态final屬性(好像删去final也不影響)
 *  3, 靜态通路靜态屬性的方法,在方法體重傳回在内部類new出來的外部封裝類對象。也就實作了延時加載 
 * @author wanna
 *
 */
public class SingletonDemo4 {      
 
 private static class SingltonClassInstance {
  private static SingletonDemo4 instance = new SingletonDemo4(); 
 }
 
 public static SingletonDemo4 getInstance() {
  return SingltonClassInstance.instance;
  
 }
 private SingletonDemo4() {
  
 }
}
      
package com.bjsxt.cn.singleton;      
/**
 * 測試枚舉實作單例模式(沒有延時加載)
 * @author wanna
 *
 */
public enum SingletonDemo5 {
 Instance;//該枚舉元素本身就是單例對象
 
 //添加自己需要的操作
 public void operation() {
  
 }
}


      

繼續閱讀