1. 程式人生 > >讀書筆記之單例模式

讀書筆記之單例模式

1.單例模式的定義

確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項.

2.單例模式的使用場景

確保某個類有且只有一個物件的場景,避免產生多個物件消耗過多的資源,或者某種型別的物件應該有且只有一個.

3.實現單例模式的幾個關鍵點

  • 建構函式不對外開放,一般為private
  • 通過一個靜態方法返回單例物件
  • 確保單例類的物件有且只有一個,尤其是在多執行緒的情況下
  • 確定單例類物件在反序列化時不會重新建立物件

4.單例模式的幾種實現方式

  • 餓漢式
public class RxBus{
    private static RxBus instance = new
RxBus(); //通過靜態方法獲取例項 public static RxBus getInstance(){ return instance; } private Object readResolve() throws ObjectStreamException{ return instnce; } }

餓漢式的缺點就是在宣告靜態物件時就已經初始化了.在一定程度上造成了資源的浪費

  • 懶漢式
private static RxBus instance ;

    //私有建構函式,防止new 物件
private RxBus(){ } //通過靜態方法獲取例項 public static RxBus getInstance(){ if (instance == null){ synchronized(RxBus.class){ if(instance == null){ instance = new RxBus(); } } } return instance; } //防止反序列化的時候生成新的物件
private Object readResolve() throws ObjectStreamException{ return instnce; }

懶漢式的有點在於既能夠在需要時才初始化單例,又能夠保證執行緒安全,這種模式的亮點就在兩次非空判斷,第一層判斷主要是避免不必要的同步,第二層判斷則是為了在null的時候才建立例項,防止多次建立.

  • 靜態內部類單例模式
public class RxBus{

    private RxBus(){
    }
    //通過靜態方法獲取例項
    public static RxBus getInstance(){
        return RxBusHolder.instance;
    }

    //靜態內部類
    private static class RxBusHolder{

        private static final RxBus instance = new RxBus();

    }


    //防止反序列化的時候生成新的物件

        private Object readResolve() throws ObjectStreamException{
            return RxBusHolder.instnce;
        }
}

這中模式避免了在宣告物件時就建立物件,只有在第一次呼叫getInstance時才會建立物件,這種方式不僅能夠保證執行緒安全,保證單例物件的唯一性,同時也延遲了單例的例項化.

  • 使用容器實現單例模式
public class SingleManager{

    private static Map<String,Object> objMap = new HashMap();
    private SingleManager(){
    }

    public statice void registerSingleManager(String key ,Objcet instance){
        if(!objMap.containsKey(key)){

            objMap.put(key,instance);
        }
    }

    public static Object getSingleManager(String key){

        return objMap.get(key);
    }

}

這種模式的使用就是在程式的初始化的時候,建立好了各種單例物件,然後放到統一的一個管理類中,然後在使用時根據key獲取對應的物件.在android的getSystemService方法就是通過這種模式來實現單例的.

總結

無論是那種模式的單例,它們的核心原理都是將建構函式私有化,並且通過靜態方法獲取唯一的一個例項.在這個獲取的過程中必須保證執行緒安全,防止反序列化的時候導致重新生成例項物件.距離的可以參考Andoird原始碼設計模式解析與實戰一書.

相關推薦

讀書筆記模式

1.單例模式的定義 確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項. 2.單例模式的使用場景 確保某個類有且只有一個物件的場景,避免產生多個物件消耗過多的資源,或者某種型別的物件應該有且只有一個. 3.實現單例模式的幾個關鍵點

《大話設計模式讀書筆記模式與Java同步鎖synchronized

單例模式,保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。在單例模式下,類本身負責儲存它的唯一例項,這個類必須保證沒有其他例項可以被建立,並且它可以提供一個訪問該例項的方法。單例模式的類中,構造方法(函式/體)被設為private,從而堵死了外部例項化該類的可能。同

Java多執行緒學習筆記21模式與多執行緒

詳細程式碼見:github程式碼地址   第六章 單例模式與多執行緒 前言: 我之前已經開設了23個設計模式這個專欄,介紹了很多的Java設計模式,其中一些模式對於絕 大多數程式語言設計思想都是類似的,需要了解單例模式的可以去看看。 我們在實際開發中經常用到單例模式,但

Java基礎個人筆記設計模式與許可權

設計模式:對問題行之有效的解決方式。其實它是一種思想。 1,單例設計模式。 解決的問題:就是可以保證一個類在記憶體中的物件唯一性。 必須對於多個程式使用同一個配置資訊物件時,就需要保證該物件的唯一性。 如何保證物件唯一性呢? 1,不允許其他程式用new建立該類物件。 2,在該類建

java學習筆記-設計模式模式如何防止反射及反序列化漏洞

在前一篇文章中,對單例模式列舉了五種實現方式。其中列舉模式擁有出生光環,天生就沒有反射及反序列化漏洞。針對其他四種實現方式,在本篇文章中對懶漢式單例模式實現進行反射及反序列化漏洞測試。 一、通過反射破解懶漢式單例模式 重新建立測試類TestClientNew,通過反射獲取

多執行緒學習筆記(三)模式中的執行緒問題

在某些情況下,每個類只需要一個例項,單例模式就是保證在整個應用程式的生命週期中,任何一個時刻,單例類的例項都只存在一個(當然也可以不存在),核心點: 將採用單例模式的類的構造方法私有化(private修飾) 在其內部產生該類的例項化物件,並將其封裝成priv

Allen學習筆記—java設計模式模式

1.單例模式分類:   懶漢式單例、餓漢式單例、登記式單例(不常用)。 2.單例模式的特點: 單例類只能有一個例項;   單例類必須自己建立自己的唯一例項;   單例類必須給所有其他物件提供這一例項; 3.單例模式示例程式碼:  餓漢式 //在類初始化時,已經自行例項化

小白筆記(設計模式模式),後續發現問題會進行修改,大神勿噴,謝謝。

提高效率 public code 靜態屬性 懶漢 加載 屬性 設計模式之單例模式 syn 單例模式 package com.bjsxt.thread.syn; /** * 單例創建方式 * 1.懶漢式 * 1)構造器私有化 * 2)聲明私有的靜態變量 * 3)對外

c++模式

lsi 但是 desc 模式 單例模式 ron spl 希望 構造函數 1 本篇主要討論下多線程下的單例模式實現:   首先是 double check 實現方式: 這種模式可以滿足多線程環境下,只產生一個實例。 template<typename T>

JAVA設計模式模式(轉)

單例對象 日誌 locking anti 常見 基本上 title 加載 懶漢式 本文繼續介紹23種設計模式系列之單例模式。 概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裏主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特

設計模式模式

ins 一次 初始 之間 懶加載 sin jdk1.5 代碼 tin 一、概念   Java中單例模式是一種非常常見的設計模式,單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 二、特點   1、單例類只有一個實例。   2、單例類必須自己創建自己的

js 模式

new message charset 業務邏輯 包含 render bin init () 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta ch

PHP模式設計模式、工廠模式、註冊樹模式、適配器模式、觀察者模式

操作符 unset 關系 玩具 ati ase color 只有一個 bsp php模式設計之單例模式   什麽是單例模式?   單例模式是指在整個應用中只有一個實例對象的設計模式   為什麽要用單例模式?   php經常要鏈接數據庫,如果在一個項目中頻繁建立連接數據庫,會

Python設計模式模式

定義 eat size 字典 con gin 自動 super pytho 單例模式單例模式需要註意的地方在於如何保證創建的實例是唯一的如何保證多線程情況下的訪問清晰明了目前有這麽幾種方法:modulemetaclass__new__decoratormodule其實,Py

PHP設計模式模式

blog inf DDU dbn 返回 bug 面向對象 程序員 userinfo 參考:http://www.cnblogs.com/yangjinjin/archive/2013/01/31/2887492.html 李炎恢PHP第三季視頻 單例模式 單例模式確保某個類

iOS設計模式模式

trac 實例 配方 implement 字節數 bsp 變量 auto == 單例模式:總是返回自己的同一個實例,它提供了對類的對象所提供的資源的全局訪問點,而且返回的實例僅僅能被實例化一次. 單例設計模式設計須要考慮的兩個問題: (1) :發起調

iOS 開發模式

ack pop sel del 結果 通信 方法 ret article 單例就是project中僅僅初始化一次,節省內存空間。或者共享資源。比如在創建藍牙類,或者做WiFi通信時經經常使用到。也能夠用來傳值。 一下介紹兩種創建單例的方法 一,考慮

理解js設計模式模式

單例 false single 這樣的 字面量 不可靠 urn 如果 == 單例模式的定義:只提供唯一的一個實例來讓你訪問 js中單例是天然存在的: var a1={ hello:‘js‘ } var a2={ hello:‘js‘ } cons

設計模式模式以及簡單代碼實現

以及 應用 安全 設計模式 div 代碼實現 測試類 加載類 實例 單例模式 保證整個應用某個實例只有一個 單例模式包括懶漢模式和餓漢模式 餓漢模式 懶漢模式 測試類 區別: 餓漢模式的特點加載類時比較慢,但運行獲取對象速度比較快 線程安全 懶漢模式加

設計模式模式 Singleton實現

-- throw return null mage demo1 nbsp 定義 所在 餓漢式 餓漢式單例模式,static變量會在類裝載時初始化,此時也不會涉及多個線程對象訪問該對象的問題。虛擬機保證只會裝載一次該類,肯定不會發生並發訪問的問題,