1. 程式人生 > >什麼是單例模式?單例模式有什麼作用?為什麼要用單例模式

什麼是單例模式?單例模式有什麼作用?為什麼要用單例模式

單例模式

單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。

注意:

  • 1、單例類只能有一個例項。
  • 2、單例類必須自己建立自己的唯一例項。
  • 3、單例類必須給所有其他物件提供這一例項。

介紹

意圖:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。

主要解決:一個全域性使用的類頻繁地建立與銷燬。

何時使用:當您想控制例項數目,節省系統資源的時候。

如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則建立。

關鍵程式碼:建構函式是私有的。

應用例項: 1、一個黨只能有一個書記。 2、Windows 是多程序多執行緒的,在操作一個檔案的時候,就不可避免地出現多個程序或執行緒同時操作一個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。 3、一些裝置管理器常常設計為單例模式,比如一個電腦有兩臺印表機,在輸出的時候就要處理不能兩臺印表機列印同一個檔案。

優點: 1、在記憶體裡只有一個例項,減少了記憶體的開銷,尤其是頻繁的建立和銷燬例項(比如管理學院首頁頁面快取)。 2、避免對資源的多重佔用(比如寫檔案操作)。

缺點:

沒有介面,不能繼承,與單一職責原則衝突,一個類應該只關心內部邏輯,而不關心外面怎麼樣來例項化。

使用場景: 1、要求生產唯一序列號。 2、WEB 中的計數器,不用每次重新整理都在資料庫里加一次,用單例先快取起來。 3、建立的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連線等。

注意事項:getInstance() 方法中需要使用同步鎖 synchronized (Singleton.class) 防止多執行緒同時進入造成 instance 被多次例項化。

為什麼要用單例模式?

public class Printer {
    private static Printer printer =null;//建立一個私有的全域性變數
    /*
     * 如果有多執行緒併發訪問時,上鎖,讓其排隊等候,一次只能一人用。
     */
    public static synchronized Printer getPrinter(){
        if(printer==null){//如果為空,建立本例項
            printer = new Printer();
        }
        return printer;
    }
    /*
     * 構造私有化,保證在系統的使用中,只有一個例項
     */
    private Printer(){
        
    }
}

從程式碼上來分析,單例模式,首先向外提供了一個可被訪問的例項化的物件,如果沒有此物件時,該printer類建立一個。如果遇到多執行緒併發訪問,加上關鍵字Synchronized,上鎖讓沒有持有該物件的類處於等待狀態。當前持有該printer的執行緒任務結束之後,處於等待中的執行緒才能逐個去持有該例項,去操作其方法。這樣的一個過程 在程式設計中被稱為單例模式。 如果在系統中不使用單例模式的話,在碰到多執行緒訪問的時候,printer就會給要請求的類,分別在記憶體中new出一個printer物件,讓這些請求的類去做print方法。這樣大量佔有記憶體,就會導致系統執行變慢,像電腦的CPU一樣,佔有量極高,電腦卡死不動的感覺。因為系統的硬體設施需求變動量小,所以只能想出一個節約成本 的方法就是,單例模式,讓多執行緒處於等待的狀態,一個 一個的去解決,這樣,即節約記憶體,提交了執行的成本。也就是單例存在的意義。