1. 程式人生 > 其它 >學習筆記:設計模式-單例模式-java實現

學習筆記:設計模式-單例模式-java實現

技術標籤:設計模式設計模式java

設計模式-單例模式

單例模式

定義

一個類只有一個例項,且該類能自行建立這個例項的一種模式。

特點

  • 單例類只有一個例項物件
  • 該單例物件必須由單例類自行建立
  • 對外提供一個訪問該單例的全域性訪問點

優點

  • 可以保證記憶體中只有一個例項,減少了記憶體的開銷
  • 可以避免對資源的多重佔用
  • 設定全域性訪問點,可以優化和共享資源的訪問

缺點

  • 單例模式一般沒有介面,擴充套件困難。如果要擴充套件,除了修改原來的程式碼,沒有第二種途徑,違背開閉原則
  • 在併發測試中,不利於程式碼除錯。在除錯過程中,如果單例中的程式碼沒有執行完,也不能模擬生成一個新的物件
  • 單例模式的功能程式碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則

應用場景

  • 需要頻繁建立的一些類,使用單例可以降低系統的記憶體壓力,減少 GC
  • 某類只要求生成一個物件的時候
  • 某些類建立例項時佔用資源較多,或例項化耗時較長,且經常使用
  • 某類需要頻繁例項化,而建立的物件又頻繁被銷燬的時候,如多執行緒的執行緒池
  • 頻繁訪問資料庫或檔案的物件
  • 對於一些控制硬體級別的操作,或者從系統上來講應當是單一控制邏輯的操作,如果有多個例項,則系統會完全亂套
  • 當物件需要被共享的場合。由於單例模式只允許建立一個物件,共享該物件可以節省記憶體,並加快物件訪問速度。如資料庫的連線池

單例模式實現

懶漢式單例



public
class Main { public static void main(String[] args) { LazySingleton lazySingleton=LazySingleton.getInstance(); } } class LazySingleton{ private static volatile LazySingleton lazySingleton = null;//保證例項在所有執行緒中同步 private LazySingleton(){ //private訪問許可權防止類在外部被例項化 }
/** * * @return */ public static synchronized LazySingleton getInstance(){ //方法前加同步 if(lazySingleton==null){ System.out.println("建立例項"); lazySingleton=new LazySingleton(); } return lazySingleton; } }

餓漢式單例



public class Main {

    public static void main(String[] args) {
        HungrySingleton hungrySingleton=HungrySingleton.getInstance();
    }
}

class  HungrySingleton{
    private  static   HungrySingleton hungrySingleton = new HungrySingleton();//保證例項在所有執行緒中同步

    private HungrySingleton(){
        //private訪問許可權防止類在外部被例項化
    }

    /**
     *
     * @return
     */
    public  static    HungrySingleton  getInstance(){
        System.out.println("返回已經生成的例項");
        return hungrySingleton;
    }
}