Java設計模式偷跑系列(六)Singleton模式的建模與實現

來源:互聯網
上載者:User

標籤:

轉載請註明出處:http://blog.csdn.net/lhy_ycu/article/details/39784403


單例模式(Singleton):是一種經常使用的設計模式。

在Java應用中。單例對象能保證在一個JVM中。該對象僅僅有一個執行個體存在。

優點主要有:1、某些類建立比較頻繁,對於一些大型的對象,這是一筆非常大的系統開銷。

2、省去了new操作符,減少了系統記憶體的使用頻率,減輕GC壓力。


單例模式主要有兩種實現方式:1、懶漢式。2、餓漢式


一、uml建模


二、代碼實現: 1、懶漢式

/** * 示範範例:單例--單例對象能保證在一個JVM中。該對象僅僅有一個執行個體存在。 *  * 缺點:這樣的做法在多線程環境下,不安全 *  * 懶漢式 */class Singleton {/** * 持有私人靜態變數(也稱類變數),防止被引用 *  * 此處賦值為null。目的是實現延遲載入 (由於有些類比較龐大,所以延遲載入有助於提升效能) */private static Singleton instance = null;/** 私人構造方法,防止被執行個體化 */private Singleton() {}/** 靜態Factory 方法,建立執行個體 --僅僅只是這裡是建立自己,並且僅僅能建立一個 */public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}public void info() {System.out.println("this is a test method...");}}/** * client測試類 *  * @author Leo */public class Test {public static void main(String[] args) {Singleton s1 = Singleton.getInstance();/** * 調用普通方法 */s1.info();Singleton s2 = Singleton.getInstance();/** * 執行結果為true。說明s1、s2這兩個類變數都指向記憶體中的同一個對象 */System.out.println(s1 == s2);}}


2、餓漢式
/** * 餓漢式 */class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}public void info() {System.out.println("this is a test method...");}}/** * client測試類 *  * @author Leo */public class Test {public static void main(String[] args) {Singleton s1 = Singleton.getInstance();/** * 調用普通方法 */s1.info();Singleton s2 = Singleton.getInstance();/** * 執行結果為true,說明s1、s2這兩個類變數都指向記憶體中的同一個對象 */System.out.println(s1 == s2);}}

3、假設考慮多線程,那麼getInstance()方法要加同步synchronized,這時餓漢式比懶漢式要好。雖然資源使用率要差,可是不用同步。

/** *  * 考慮多線程的時候。以下這樣的做法能夠參考一下:--懶漢式 *  * 在建立類的時候進行同步。所以僅僅要將建立和getInstance()分開,單獨為建立加synchronizedkeyword *  * 這樣的做法考慮效能的話,整個程式僅僅需建立一次執行個體,所以效能也不會有什麼影響。 *  * @author Leo */public class SingletonTest {private static SingletonTest instance = null;private SingletonTest() {}private static synchronized void syncInit() {if (instance == null) {instance = new SingletonTest();}}public static SingletonTest getInstance() {if (instance == null) {syncInit();}return instance;}}

三、總結

單例模式保證了一個類僅僅有一個執行個體,且提供一個訪問全域點的方式,更加靈活的保證了執行個體的建立和訪問約束。

系統中僅僅有一個執行個體。因此構造方法應該為私人 餓漢式:類載入時直接建立靜態執行個體。懶漢式:第一次須要時才建立一個執行個體,那麼getInstance方法要加同步 餓漢式比懶漢式要好。雖然資源使用率要差。可是不用同步。



著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。

Java設計模式偷跑系列(六)Singleton模式的建模與實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.