java設計模式-單列模式

基本概念:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

常見寫法:

懶漢式

package com.ck.gof;

public class Singleton {

/* 持有私有靜態實例,防止被引用,此處賦值為null,目的是實現延遲加載 */

private static Singleton instance = null;

private Singleton() {

}

/* 1:懶漢式,靜態工程方法,創建實例 */

public static Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

調用:

Singleton.getInstance().method();


優點:延遲加載(需要的時候才去加載),適合單線程操作

缺點: 線程不安全,在多線程中很容易出現不同步的情況,如在數據庫對象進行的頻繁讀寫操作時。

雙重線程檢查模式

public class SingletonInner {  private static volatile SingletonInner sInst = null; // <<< 這裡添加了 volatile  /** * 私有的構造函數 */  private SingletonInner() {}  public static SingletonInner getInstance() {  SingletonInner inst = sInst; // <<< 在這裡創建臨時變量 if (inst == null) { synchronized (SingletonInner.class) { inst = sInst; if (inst == null) { inst = new SingletonInner(); sInst = inst; } } } return inst; // <<< 注意這裡返回的是臨時變量 }  protected void method() {  System.out.println("SingletonInner");  } }

調用:

Singleton.getInstance().method();

優點:延遲加載,線程安全

缺點: 寫法複雜,不簡潔

內部類的實現

public class SingletonInner {

/** * 內部類實現單例模式 * 延遲加載,減少內存開銷 */

private static class SingletonHolder {

private static SingletonInner instance = newSingletonInner();

}

/** * 私有的構造函數 */privateSingletonInner() {}

public static SingletonInner getInstance() {

return SingletonHolder.instance;

}

protected void method() {

System.out.println("SingletonInner");

}

}

調用:

Singleton.getInstance().method();


分享到:


相關文章: