這裡需要例項化但不使用new方式,可以在構造方法前面新增private,私有化構造方法。
(使用背景:所有類都有構造方法,不單獨編寫構造方法則系統預設使用空構造,單獨編寫構造方法的話,預設的構造器就會失效)
然後需要單獨建立乙個公共方法來專門返回乙個類例項。在該方法中需要對是否例項化有乙個判斷,若沒有例項化過,有呼叫private的構造方法new乙個例項,然後該例項可以被繼續呼叫當有需要的時候,同乙個類中private方法可以被訪問。
保證乙個類有只能有乙個例項,並提供訪問他的全域性訪問點。
單例模式結構圖:
好處:
保證唯一例項
嚴格控制其他類的訪問,不會出現資源衝突,其他類每次只能訪問乙個該類。可控性強。
第一次呼叫就例項化自己,
第一次就是在之前沒有該物件,需要的時候才建立自己。
(使用時才被啟用)
一般寫法:
public
class singleton
private
static singleton single = null;
public
static singleton getinstance()
}}
在多執行緒模式下,可能會被多次例項化。
書上說該方法不安全執行緒不安全
改進:
1.在gentinstance方法上加上同步鎖
public
static
synchronized singleton getinstance()
return single;
}
2.可以使用雙重檢查
public
static singleton getinstance()}}
return single;
}
3.靜態內部類
public
class singleton
}
*推薦使用,實現了執行緒安全,避免了同步鎖造成的效能影響。
在類初始化的時候,已經存在乙個唯一物件,本身是執行緒安全的
public
class
singleton
private
static
final singleton single = new singleton();
public
static single gentinstance()
}
物件一開始就建立好了,不會出現多執行緒中的被多次建立的問題。
這是我在看書之前自己的總結:
所謂懶漢和餓漢模式設計思路一樣,區別在建立例項化物件的時機.還是有所收穫的。懶漢式:在程式中一開始就有乙個例項化物件,只是在需要呼叫的時候直接呼叫該物件,公共方法就只是返回該物件。
餓漢式:他就是上面的描述過程,在共有的方法中判斷是否已經存在該物件,然後選擇是否建立該物件。
餓漢式天生就是執行緒安全的,可以直接用於多執行緒;
懶漢式本身是非執行緒安全的,為了實現執行緒安全有上面的1、2、3三種方式,這三種方式在資源和效能上有寫區別
餓漢式在類建立的同時就例項化乙個靜態物件,不管之後會不會使用這個單例,都會佔據一定的記憶體,但是相應的,在第一次呼叫時速度也會更快,因為資源已經初始化完成。
而懶漢式顧名思義,會延遲載入,在第一次使用該單例的會後才會例項化物件出來第一次呼叫時要做初始化,如果要做的工作比較多,效能上會有延遲,之後就和餓漢式一樣
針對懶漢式1、2、3三種實現的區別
1:在方法上呼叫了同步鎖,雖讓執行緒安全了,但是每次都要同步,會影響效能.
2:在getinstance中做了兩次判斷物件存在性的檢查,確保了只有第一次呼叫單例的時候才會去同步,這樣既實現了執行緒安全,同時避免了每次都同步的效能損耗
3:利用classloader機制(類載入機制)來保證初始化instance時既能只有乙個執行緒,所以也是執行緒安全的,同時沒有效能損耗,推薦這種
設計模式讀書筆記 單例模式
有時候某些物件我們只需要乙個,如 執行緒池 快取 對話方塊等等,對於這類物件我們只能有乙個例項,如果我 們製造出多個例項,就會導致很多問題產生。但是我們怎樣才能保證乙個類只有乙個例項並且能夠便於訪問?這裡我們想到了全域性變數,全域性變數確實是可以 保證該類可以隨時訪問,但是它很難解決只有乙個例項問題...
設計模式讀書筆記 單例模式
有時候某些物件我們只需要乙個,如 執行緒池 快取 對話方塊等等,對於這類物件我們只能有乙個例項,如果我 們製造出多個例項,就會導致很多問題產生。但是我們怎樣才能保證乙個類只有乙個例項並且能夠便於訪問?這裡我們想到了全域性變數,全域性變數確實是可以 保證該類可以隨時訪問,但是它很難解決只有乙個例項問題...
大話設計模式讀書筆記2 策略模式
策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類直接的耦合。uml 圖 根據 大話設計模式 第二章 商場 這個案例 來簡單的記錄一下策略模式的使用方式 現金收費抽象類 publi...