單例模式: 分析: 1、單例模式,從字面意思上理解,“單例”,即只有唯一一個實例,通常情況下,定義一個類,然後通過new ClassName()方式來產生具體對象,然而這樣,破壞了一個類只有一個實例,怎麼處理該問題呢?將類的具體化放在類的構造函數來完成。 2、如上方式解決了單例問題,然而,外界如何才 ...
單例模式:
分析:
1、單例模式,從字面意思上理解,“單例”,即只有唯一一個實例,通常情況下,定義一個類,然後通過new ClassName()方式來產生具體對象,然而這樣,破壞了一個類只有一個實例,怎麼處理該問題呢?將類的具體化放在類的構造函數來完成。
2、如上方式解決了單例問題,然而,外界如何才能訪問該類?很簡單,該類提供一個全局的訪問點即可。
3、根據以上1,2步驟的劃分,單例模式有2個很明顯特點:(1)類只有一個實例 (2)類必須提供全局唯一的可被訪問點。
Code:
註釋:如下源碼引用 http://cantellow.iteye.com/blog/838473 後期,我會結合c++/java作深入分析,現階段只是初步掃盲。
第一種(懶漢,線程不安全):
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
第二種(懶漢,線程安全):
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
第三種(餓漢):
1 public class Singleton { 2 private static Singleton instance = new Singleton(); 3 private Singleton (){} 4 public static Singleton getInstance() { 5 return instance; 6 } 7 }
第四種(餓漢,變種):
public class Singleton { private Singleton instance = null; static { instance = new Singleton(); } private Singleton (){} public static Singleton getInstance() { return this.instance; } }
第五種(靜態內部類):
1 public class Singleton { 2 private static class SingletonHolder { 3 private static final Singleton INSTANCE = new Singleton(); 4 } 5 private Singleton (){} 6 public static final Singleton getInstance() { 7 return SingletonHolder.INSTANCE; 8 } 9 }
第六種(枚舉):
1 public enum Singleton { 2 INSTANCE; 3 public void whateverMethod() { 4 } 5 }
第七種(雙重校驗鎖):
1 public class Singleton { 2 private volatile static Singleton singleton; 3 private Singleton (){} 4 public static Singleton getSingleton() { 5 if (singleton == null) { 6 synchronized (Singleton.class) { 7 if (singleton == null) { 8 singleton = new Singleton(); 9 } 10 } 11 } 12 return singleton; 13 } 14 }