1. 程式人生 > >(面試常問)4種單例設計模式的總結(內含程式碼以及分析)

(面試常問)4種單例設計模式的總結(內含程式碼以及分析)

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