设计模式研究(二)-Singleton
生活随笔
收集整理的這篇文章主要介紹了
设计模式研究(二)-Singleton
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上篇:設計模式研究(一)實例比較TemplateMethod與Strategy
調用端調用一個類時,他是不需要也不會去考慮這個類是否已經被實例化的。而且把這樣的監管工作交給調用端是很不負責的做法。
b)類型內部保證。
????{
????????Singleton?Instance?=?null;
????????// 實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?=?new?Singleton();
????????????return?Instance;
????????}
????}
????{
????????Singleton?Instance?=?null;
????????//實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?=?new?Singleton();
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,實例化時判斷類型有沒有被創建過,這樣就保證了實例的唯一
????????Singleton?GetInstance()
????????{
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????}
????{
????????Singleton?Instance?=?null;
????????public?int?Count?{?get;?set;?}
????????//實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?=?new?Singleton();
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,實例化時判斷類型有沒有被創建過,這樣就保證了實例的唯一
????????Singleton?GetInstance()
????????{
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,并且加入一個計數器,這樣能知道實例化工作被執行了多少次
????????Singleton?GetInstance()
????????{
????????????Count++;
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????}
????{
????????Singleton?Instance?=?null;
????????public?int?Count?{?get;?set;?}
????????//實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?=?new?Singleton();
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,實例化時判斷類型有沒有被創建過,這樣就保證了實例的唯一
????????Singleton?GetInstance()
????????{
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,并且加入一個計數器,這樣能知道實例化工作被執行了多少次
????????Singleton?GetInstance()
????????{
????????????Count++;
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,并且接收一個合法的授權,這樣可以知道每個授權方的調用次數,使用頻率
????????Singleton?GetInstance(string?caller)
????????{
????????????//Check?調用方合法性驗證
????????????if?(Check(caller))
????????????{
????????????????CallerCount(caller);
????????????????if?(Instance?==?null)
????????????????{
????????????????????Instance?=?new?Singleton();
????????????????}
????????????????return?Instance;
????????????}
????????????else
????????????????return?null;
????????}
????????//記錄調用方調用次數
????????public?void?CallerCount(string?caller)
????????{
????????????//caller?Count++
????????}
????????public?bool?Check(string?caller)
????????{
????????????return?true;
????????}
????}
????{
????????static?MySingleton?instance?=?null;
????????MySingleton()?{?}
????????//簡單寫法
????????public?static??MySingleton?Istance?
????????{
????????????get
????????????{
????????????????if?(instance?==?null)
????????????????{
????????????????????instance?=?new?MySingleton();
????????????????}
????????????????return?instance;
????????????}
????????}
????????//線程安全
????????static?readonly?object?obj?=?new?object();
????????public?static?MySingleton?SafeInstance
????????{
????????????get
????????????{
????????????????lock?(obj)
????????????????{
????????????????????if?(instance?==?null)
????????????????????????instance?=?new?MySingleton();
????????????????????return?instance;
????????????????}
????????????}
????????}
????????//雙重鎖定?節約開銷
????????public?static?MySingleton?LockInstance
????????{
????????????get
????????????{
????????????????if?(instance?==?null)
????????????????{
????????????????????lock?(obj)
????????????????????{
????????????????????????if?(instance?==?null)
????????????????????????????instance?=?new?MySingleton();
????????????????????}
????????????????}
????????????????return?instance;
????????????}
????????}
????????//靜態初始化
????????static?MySingleton()?{?}
????????static?readonly?MySingleton?staticinstance?=?new?MySingleton();
????????public?static?MySingleton?StaticInstance
????????{
????????????get
????????????{
????????????????return?staticinstance;
????????????}
????????}
????????//延遲初始化
????????public?static?MySingleton?lazyInstance
????????{
????????????get
????????????{
????????????????return?Lazy.staticinstance;
????????????}
????????}
????????class?Lazy
????????{
????????????internal?static?readonly?MySingleton?staticinstance?=?new?MySingleton();
????????????static?Lazy()?{?}
????????}
????}
本篇先討論單件 Singleton,單件的目標是保證一個類型只有一個實例,那么由誰來保證實例的唯一性呢?可能的方案有:
調用端調用一個類時,他是不需要也不會去考慮這個類是否已經被實例化的。而且把這樣的監管工作交給調用端是很不負責的做法。
b)類型內部保證。
類型內部如何保證?
將實例創建工作放到類型內部,這樣類型就可以將實例創建工作監管起來。類型可以知道內部的實例有沒有被創建,甚至可以知道創建實例的工作被執行了多少次。
所以個人認為理解單件需要分為兩步:
1、 監管工作誰來做?實例的監管工作需要類型自己去做。
2、 監管工作如何做?類型如何保證實例唯一就是技術實現問題了,可以看到的版本有 線程安全的、雙重鎖定的、延遲初始化的等。
下面使用偽代碼逐步分析實例化工作放到類型內部的做法。
?調用我,實例我給你
????{
????????Singleton?Instance?=?null;
????????// 實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?=?new?Singleton();
????????????return?Instance;
????????}
????}
你只管調用,我保證唯一
????{
????????Singleton?Instance?=?null;
????????//實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?=?new?Singleton();
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,實例化時判斷類型有沒有被創建過,這樣就保證了實例的唯一
????????Singleton?GetInstance()
????????{
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????}
你們都可以調用,我需要統計調用次數
????{
????????Singleton?Instance?=?null;
????????public?int?Count?{?get;?set;?}
????????//實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?=?new?Singleton();
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,實例化時判斷類型有沒有被創建過,這樣就保證了實例的唯一
????????Singleton?GetInstance()
????????{
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,并且加入一個計數器,這樣能知道實例化工作被執行了多少次
????????Singleton?GetInstance()
????????{
????????????Count++;
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????}
想使用實例?請出示合法證件
????{
????????Singleton?Instance?=?null;
????????public?int?Count?{?get;?set;?}
????????//實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?=?new?Singleton();
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,實例化時判斷類型有沒有被創建過,這樣就保證了實例的唯一
????????Singleton?GetInstance()
????????{
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,并且加入一個計數器,這樣能知道實例化工作被執行了多少次
????????Singleton?GetInstance()
????????{
????????????Count++;
????????????if?(Instance?==?null)
????????????{
????????????????Instance?=?new?Singleton();
????????????}
????????????return?Instance;
????????}
????????//?實例化類型?Singleton,并且接收一個合法的授權,這樣可以知道每個授權方的調用次數,使用頻率
????????Singleton?GetInstance(string?caller)
????????{
????????????//Check?調用方合法性驗證
????????????if?(Check(caller))
????????????{
????????????????CallerCount(caller);
????????????????if?(Instance?==?null)
????????????????{
????????????????????Instance?=?new?Singleton();
????????????????}
????????????????return?Instance;
????????????}
????????????else
????????????????return?null;
????????}
????????//記錄調用方調用次數
????????public?void?CallerCount(string?caller)
????????{
????????????//caller?Count++
????????}
????????public?bool?Check(string?caller)
????????{
????????????return?true;
????????}
????}
?歡迎一起討論!
?--------------------------補充-------------------------------
我把幾種流行的 Singleton 寫法發出來,省的大家再去查資料。
??public?sealed?class?MySingleton????{
????????static?MySingleton?instance?=?null;
????????MySingleton()?{?}
????????//簡單寫法
????????public?static??MySingleton?Istance?
????????{
????????????get
????????????{
????????????????if?(instance?==?null)
????????????????{
????????????????????instance?=?new?MySingleton();
????????????????}
????????????????return?instance;
????????????}
????????}
????????//線程安全
????????static?readonly?object?obj?=?new?object();
????????public?static?MySingleton?SafeInstance
????????{
????????????get
????????????{
????????????????lock?(obj)
????????????????{
????????????????????if?(instance?==?null)
????????????????????????instance?=?new?MySingleton();
????????????????????return?instance;
????????????????}
????????????}
????????}
????????//雙重鎖定?節約開銷
????????public?static?MySingleton?LockInstance
????????{
????????????get
????????????{
????????????????if?(instance?==?null)
????????????????{
????????????????????lock?(obj)
????????????????????{
????????????????????????if?(instance?==?null)
????????????????????????????instance?=?new?MySingleton();
????????????????????}
????????????????}
????????????????return?instance;
????????????}
????????}
????????//靜態初始化
????????static?MySingleton()?{?}
????????static?readonly?MySingleton?staticinstance?=?new?MySingleton();
????????public?static?MySingleton?StaticInstance
????????{
????????????get
????????????{
????????????????return?staticinstance;
????????????}
????????}
????????//延遲初始化
????????public?static?MySingleton?lazyInstance
????????{
????????????get
????????????{
????????????????return?Lazy.staticinstance;
????????????}
????????}
????????class?Lazy
????????{
????????????internal?static?readonly?MySingleton?staticinstance?=?new?MySingleton();
????????????static?Lazy()?{?}
????????}
????}
?
?
?
轉載于:https://www.cnblogs.com/tenghoo/archive/2010/08/18/tenghoo_Singleton.html
總結
以上是生活随笔為你收集整理的设计模式研究(二)-Singleton的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex学习笔记2010-08-16
- 下一篇: 定点c程序之一:定标