1. 程式人生 > >2,單例模式

2,單例模式

pre 類名 需求 靜態方法 sync nal 技術 訪問 資源

一、什麽是單例模式

單例模式是一種對象創建型模式,使用單例模式,可以保證為一個類只生成唯一的實例對象。也就是說,在整個程序空間中,該類只存在一個實例對象。其實,GoF對單例模式的定義是:保證一個類、只有一個實例存在,同時提供能對該實例加以訪問的全局訪問方法。

二、為什麽要使用單例模式呢?

在應用系統開發中,我們常常有以下需求:

- 在多個線程之間,比如servlet環境,共享同一個資源或者操作同一個對象

- 在整個程序空間使用全局變量,共享資源

- 大規模系統中,為了性能的考慮,需要節省對象的創建時間等等。

因為單例模式(Singleton)模式可以保證為一個類只生成唯一的實例對象,所以這些情況,單例模式(Singleton)模式就派上用場了。

三、單例模式實現

1,餓漢式

/**
 * 
 * @類名稱:Persion
 * @類描述:餓漢式單例模式
 * @創建人:zender
 * @創建時間:2017年7月15日下午4:10:46
 */
public class Persion {
    private static final Persion p = new Persion();
    private String name;
    //構造函數私有化
    private Persion(){
        
    }
    //提供一個全局的靜態方法
    public static Persion getePersion() {
        
return p; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

2,懶漢式

/**
 * 
 * @類名稱:Persion
 * @類描述:懶漢式單例模式
 * @創建人:zender
 * @創建時間:2017年7月15日下午4:13:56
 */
public class Persion {
    private static Persion p;
    private
String name; //構造函數私有化 private Persion(){ } //提供一個全局的靜態方法 public static Persion getePersion() { if(p == null){ return new Persion(); } else { return p; } } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class TestClass {
    public static void main(String[] args) {
        Persion p1 = Persion.getePersion();
        Persion p2 = Persion.getePersion();
        p1.setName("李四");
        p2.setName("張勝男");
        
        System.out.println(p1.getName());
        System.out.println(p2.getName());
    }
}

技術分享

餓漢式在多線程中可以保證Persian只有一個,而懶漢式不能。

3,雙重檢查

雙重檢查可以解決懶漢式所遺留多線程的問題。保證Persion只有一個

/**
 * 
 * @類名稱:Persion
 * @類描述:雙重檢查
 * @創建人:zender
 * @創建時間:2017年7月15日下午4:17:56
 */
public class Persion {
    private static Persion p;
    private String name;
    //構造函數私有化
    private Persion(){
        
    }
    //提供一個全局的靜態方法
    public static Persion getePersion() {
        if(p == null){//檢查第一次
            synchronized (Persion.class) {
                if(p == null){//檢查第二次
                    return new Persion();
                }
            }
        }
        return p;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

2,單例模式