設計模式之單例模式

2022-07-25 14:39:47 字數 2567 閱讀 9691

1.將該類的構造方法定義為私有方法,這樣其他處的**就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項;

2.在該類內提供乙個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用。

1、餓漢式(靜態常量)[可用]
public class singleton 

public static singleton getinstance()

}

優點:這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。

缺點:在類裝載的時候就完成例項化,沒有達到lazy loading的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費。

2、餓漢式(靜態**塊)[可用]

public class singleton 

private singleton() {}

public static singleton getinstance()

}

這種方式和上面的方式其實類似,只不過將類例項化的過程放在了靜態**塊中,也是在類裝載的時候,就執行靜態**塊中的**,初始化類的例項。優缺點和上面是一樣的。

3、懶漢式(執行緒不安全)[不可用]

public class singleton 

public static singleton getinstance()

return singleton;

}}

這種寫法起到了lazy loading的效果,但是只能在單執行緒下使用。如果在多執行緒下,乙個執行緒進入了if (singleton == null)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。所以在多執行緒環境下不可使用這種方式。

4、懶漢式(執行緒安全,同步方法)[不推薦用]

public class singleton 

public static synchronized singleton getinstance()

return singleton;

}}

解決上面第三種實現方式的執行緒不安全問題,做個執行緒同步就可以了,於是就對getinstance()方法進行了執行緒同步。

缺點:效率太低了,每個執行緒在想獲得類的例項時候,執行getinstance()方法都要進行同步。而其實這個方法只執行一次例項化**就夠了,後面的想獲得該類例項,直接return就行了。方法進行同步效率太低要改進。

5、懶漢式(執行緒安全,同步**塊)[不可用]

public class singleton 

public static singleton getinstance()

}return singleton;

}}

由於第四種實現方式同步效率太低,所以摒棄同步方法,改為同步產生例項化的的**塊。但是這種同步並不能起到執行緒同步的作用。跟第3種實現方式遇到的情形一致,假如乙個執行緒進入了if (singleton == null)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。

6、雙重檢查[推薦用]

public class singleton 

public static singleton getinstance() }}

return singleton;

}}

double-check概念對於多執行緒開發者來說不會陌生,如**中所示,我們進行了兩次if (singleton == null)檢查,這樣就可以保證執行緒安全了。這樣,例項化**只用執行一次,後面再次訪問時,判斷if (singleton == null),直接return例項化物件。

優點:執行緒安全;延遲載入;效率較高。

7、靜態內部類[推薦用]

public class singleton 

private static class singletoninstance

public static singleton getinstance()

}

這種方式跟餓漢式方式採用的機制類似,但又有不同。兩者都是採用了類裝載的機制來保證初始化例項時只有乙個執行緒。不同的地方在餓漢式方式是只要singleton類被裝載就會例項化,沒有lazy-loading的作用,而靜態內部類方式在singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getinstance方法,才會裝載singletoninstance類,從而完成singleton的例項化。

類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。

優點:避免了執行緒不安全,延遲載入,效率高。

8、列舉[推薦用]

public enum singleton 

}

借助jdk1.5中新增的列舉來實現單例模式。不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件。可能是因為列舉在jdk1.5中才新增,所以在實際專案開發中,很少見人這麼寫過。

適用場合

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...