標籤:
轉載請註明出處: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模式的建模與實現