1. 程式人生 > >設計模式(1)-單例設計模式

設計模式(1)-單例設計模式

關注我,每天都有優質技術文章推送,工作,學習累了的時候放鬆一下自己。 
本篇文章同步微信公眾號 

歡迎大家關注我的微信公眾號:「醉翁貓咪」 


今天我們講講什麼是單例設計模式,單例設計模式,(singleton):單例設計模式是最簡單的設計模式,面試常考

單例設計模式

就是在某一個類中,在整個應用中,有且只有一個例項(物件),即是一個類中只有一個物件例項。在一般的開發中工具性地類,設計是為單例的。對於單例設計模式有N種寫法。

單例模式一般寫法:


public class Singleton{
private static final Singleton instance = new Singleton();
 //指向自己例項的私有靜態引用
 //私有的構造方法
 private Singleton(){
 }
 public static Singleton getInstance(){
 //以自己為例項,返回值
  return instance;
 }
}

單例設計模式的優缺點:

優點:在單例設計模式中記憶體只有一個例項,減少了記憶體空間,特別是避免了一個物件需要頻繁地建立,銷燬物件,可以提高效能,單例設計模式只生成一個例項,大大提高了系統的效能,單例設計模式可以避免對資源的多重佔用,比如我們在寫一個檔案操作,由於只有一個例項存在,避免了對同一個資原始檔的同時操作。單例設計模式可以全域性訪問,設計一個單例類,負責所有的資料表對映處理。

缺點:對於單例設計模式的缺點,單例設計模式很容易導致程式記憶體洩漏,單例設計模式一般沒有介面,擴充套件困難,若要進行擴充套件,只有修改程式碼。

單例設計模式


public class Singleton{
   private singleton(){}

   private static final Singleton instance = new Singleton();

   public static Singleton getInstance(){
        return instance;
   }

   public void sort(int[] arr){
       TODO
   }
   public int binarySearch(int[] arr,int key){
       TODO
   }
}

單例設計模式的特點:

步驟:

       1):私有化構造器;

       2):自身事先提供好一個物件(private static final);

       3):向外暴露一個公共的靜態方法,用於返回該物件。

單例設計模式的餓漢單例寫法

public class Singleton {  
   private static Singleton instance = new Singleton();  
    private Singleton (){
    }
    public static Singleton getInstance() {  
      return instance;  
    }  
}

單例設計模式的懶漢單例寫法

public class Singleton {  
     private static Singleton instance;  
     private Singleton (){
     }
     public static synchronized Singleton getInstance() {  
       if (instance == null) {  
         instance = new Singleton();  
       }  
     return instance;  
     }  
}

餓漢式在類建立時就例項一個靜態的物件交給自己使用,所以執行緒是安全的,但由於每次呼叫getInstance方法時都要進行同步,這是我們大部分不需要的操作。

DCL形式


public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){
      //TODO
    }   
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
       }  
   }  
   return singleton;  
   }  
}

DCL這種寫法對singleton進行了兩次判空,如程式碼所示,第一次判斷是為了不必要的同步,第二次是是否建立例項,在DCL形式中資源利用率高。

總結:

單例模式有很多種,但其原理就是將建構函式進行私有化,通過靜態公有方法獲取唯一例項。

如果覺得不錯,可以分享哦,你的鼓勵是我最大的進步!


從入門到熟悉!

堅決不放棄!