(面試常問)4種單例設計模式的總結(內含程式碼以及分析)
阿新 • • 發佈:2018-11-28
單例設計模式:
單例模式,是一種常見的軟體設計模式.在它的核心結構中只包含了一個被稱為單例的特殊類.通過單例模式可以保證系統中只有該類的一個例項物件.
優點 :
例項控制:單例模式會阻止其它物件例項化其自己的單例物件的副本,從而確保所有物件都訪問的是唯一的例項
靈活性:因為類控制了例項化過程,所以類可以很靈活的更改例項化的過程
實現單例需要如下幾步(基礎):
1私有化建構函式
2建立一個本類物件
3 向外提供一個方法,返回這個本類物件
1餓漢式
優點:執行緒安全,允許多個執行緒同時訪問
缺點:會提前初始化單例物件(在類載入的時候)
2懶漢式:
優點:不會提前初始化單例物件
缺點:執行緒不安全
解決方案可以通過加鎖進行解決,但是加鎖之後,效率低
1 /** 2 * @Author : zhuhuicong 3 * 2018/11/27 21:08 4 * @Version 1.0 5 * 懶漢式 6 */ 7 public class SingalDemo01 { 8 private static SingalDemo01 singalDemo01 = new SingalDemo01(); 9 private SingalDemo01() { 10 } 11 12 public static SingalDemo01 getInstance(){ 13 return singalDemo01; 14 } 15 }View Code
1 /** 2 * @Author : zhuhuicong 3 * 2018/11/27 21:12 4 * @Version 1.0 5 */ 6 public class SingalDemo02 { 7 private static SingalDemo02 singalDemo02 = nullView Code 3 雙重檢測鎖機制: 執行緒安全並且不會提前初始化例項物件(注意兩次判斷檢測的作用); 8 private SingalDemo02() { 9 } 10 public static synchronized SingalDemo02 getInstance(){ 11 if(singalDemo02==null){ 12 singalDemo02 = new SingalDemo02(); 13 } 14 return singalDemo02; 15 } 16 }
1 /** 2 * @Author : zhuhuicong 3 * 2018/11/27 21:17 4 * @Version 1.0 5 */ 6 public class SingalDemo03 { 7 private static SingalDemo03 singalDemo03 = null; 8 private SingalDemo03() { 9 } 10 11 public static SingalDemo03 getInstance(){ 12 if(singalDemo03==null){ //第一個if是為了避免每次進來都加鎖,提高效率 13 synchronized (SingalDemo03.class){ 14 if(singalDemo03==null){ //第二個if是為了避免生成多個例項物件 15 singalDemo03 = new SingalDemo03(); 16 } 17 } 18 } 19 return singalDemo03; 20 } 21 }View Code 4靜態內部類的方式: 執行緒安全,並且不會提前初始化(物件只會在內部類載入的時候初始化,內部類只會在呼叫getInstance()方法的時候載入)
1 /** 2 * @Author : zhuhuicong 3 * 2018/11/27 21:24 4 * @Version 1.0 5 */ 6 public class SingalDemo04 { 7 private SingalDemo04() { 8 } 9 10 public static class Inner{ 11 public static SingalDemo04 Instance; 12 } 13 14 public static SingalDemo04 getInstance(){ 15 return Inner.Instance; 16 } 17 }View Code