前篇——軟體設計模式-基礎
前篇——軟體設計模式-三種工廠模式
前篇——軟體設計模式-裝飾者模式
單例模式是建立型模式
2. 單例模式的實現
3. 例子
在實踐專案開發中經常會遇到一些物件,這樣的物件在全域性當中僅存在乙個就可以。如果出現多個。程式執行可能會失敗。或是記憶體上的管理問題。就是只需要乙個即可,比如單位的公章。
記得之前英語學the的用法(用來特指唯一的存在的事物)
the sun、the moon
定義:單例模式是確保乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
單例類只有乙個例項物件(不能通過像以往的 new 來建立物件)
該單例物件必須由單例類自行建立
單例類對外提供乙個訪問該單例的全域性訪問點(即有乙個對外的方法)
(單例模式的結構中只包含乙個角色)
單例類:包含乙個例項且能自行建立這個例項的類。
單例類有乙個包含自身宣告的類變數private singleton uniqueinstance;
用來儲存單例物件的乙個變數(私有)
類變數:(static)
還有乙個 getinstance() 靜態方法來獲得它的例項
構造方法:單例類的構造方法訪問許可權是private
怎麼樣保證建立的物件具有唯一性呢:讓單例類的構造方法私有化即可。
懶漢式為啥稱懶呢,就是類載入時不生成例項物件,等到第一次呼叫 getinstance() 方法時才去建立。
public
class
lazysingleton
//向外提供獲取物件的方法
public
static
synchronized lazysingleton getinstance()
return instance;
}}
sychronized(同步**塊關鍵字)
併發程式設計 sychronized 的使用——來自 淘小笛 的部落格
sychronized 解決的是避免多個執行緒多次執行instance = new lazysingleton();
避免建立多個物件生成,違反了單例模式設計初衷。(即假如此時有a、b兩個執行緒,a執行緒執行完畢後,b執行緒才可以進行)
餓漢式呢,見名知意,就是比較飢渴
單例類只要一載入就建立乙個單例,在呼叫getinstance()方法前就已經存在單例了。
public
class
hungrysingleton
public
static hungrysingleton getinstance()
}
q:為什麼不用sychronized關鍵字了:static變數會在裝載時初始化。此時不會涉及多個執行緒物件訪問該物件的問題,虛擬機器保證只會裝載一次該類,肯定不會發生訪問的問題。因此可省略synchronized關鍵字
餓漢式不足:就是你提前建立的物件是必須建立的,即之後會不會用到不確定,用不到就是資源的浪費。
分類懶漢式實現
餓漢式實現
執行緒不安全
安全呼叫效率不高高
延時載入
可以不可以
載入類的速度快慢
載入物件的速度慢快
public
class
moon
public
static
synchronized moon getmoon()
return uniquemoon;
}public string show()
}public
class
demomoon
}
某個類只要求生成乙個物件(如:乙個班中的班長、每個人的身份證號)
當類需要被頻繁的例項化,而建立的物件又頻繁的被銷毀的時候(如:多執行緒的執行緒池、網路連線池)
減少了系統效能的開銷,當乙個物件事多(比如讀取配置、產生其他依賴物件),則通過應用啟動時直接產生乙個單例物件,然後永久駐留記憶體的方式來解決。
單例模式的唯一例項有單例類本身控制,可以很好的控制使用者何時訪問它。
軟體設計模式 單例模式
單例模式,顧名思義,就是只能由乙個例項,那麼我們就必須保證 該類不能被複製。該類不能被公開的創造。那麼對於c 來說,他的建構函式,拷貝建構函式和他的賦值函式都不能被公開呼叫。但對於該私有的建構函式的構造時機上來說也可以分兩種情況來構造 只有當需要改類的時候去構造 即為懶漢模式 在程式開始之前我就先構...
軟體設計模式修煉 單例模式
通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於被外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決辦法。對系統中某些類來說,只有乙個例項很重要,例如,乙個系統只能有乙個視窗管理器或檔案系統。因此確保系統中某個物件的唯一性即乙個...
軟體設計模式之單例模式
保證乙個類僅有乙個例項,並提供乙個全域性訪問點 建立型想確保任何情況下都絕對只有乙個例項 在記憶體裡只有乙個例項,減少了記憶體開銷。可以避免對資源的多重占用。設定全域性訪問點,嚴格控制訪問。沒有介面,擴充套件困難 傳統懶漢模式 如下 public class lazysingleton public...