上篇:設計模式研究(一)例項比較templatemethod與strategy
本篇先討論單件singleton,單件的目標是保證乙個型別只有乙個例項,那麼由誰來保證例項的唯一性呢?可能的方案有:
a)呼叫端保證。
呼叫端呼叫乙個類時,他是不需要也不會去考慮這個類是否已經被例項化的。而且把這樣的監管工作交給呼叫端是很不負責的做法。
b)型別內部保證。
型別內部如何保證?
將例項建立工作放到型別內部,這樣型別就可以將例項建立工作監管起來。型別可以知道內部的例項有沒有被建立,甚至可以知道建立例項的工作被執行了多少次。
所以個人認為理解單件需要分為兩步:
1、 監管工作誰來做?例項的監管工作需要型別自己去做。
2、 監管工作如何做?型別如何保證例項唯一就是技術實現問題了,可以看到的版本有 執行緒安全的、雙重鎖定的、延遲初始化的等。
下面使用偽**逐步分析例項化工作放到型別內部的做法。
呼叫我,例項我給你
class
singleton
}你只管呼叫,我保證唯一
class
singleton
//例項化型別 singleton,例項化時判斷型別有沒有被建立過,這樣就保證了例項的唯一
singleton getinstance()
return
instance;}}
你們都可以呼叫,我需要統計呼叫次數
class
singleton
//例項化型別 singleton
singleton getinstance()
//例項化型別 singleton,例項化時判斷型別有沒有被建立過,這樣就保證了例項的唯一
singleton getinstance()
return
instance;}//
例項化型別 singleton,並且加入乙個計數器,這樣能知道例項化工作被執行了多少次
singleton getinstance()
return
instance;}}
想使用例項?請出示合法證件
class
singleton
//例項化型別 singleton
singleton getinstance()
//例項化型別 singleton,例項化時判斷型別有沒有被建立過,這樣就保證了例項的唯一
singleton getinstance()
return
instance;}//
例項化型別 singleton,並且加入乙個計數器,這樣能知道例項化工作被執行了多少次
singleton getinstance()
return
instance;}//
例項化型別 singleton,並且接收乙個合法的授權,這樣可以知道每個授權方的呼叫次數,使用頻率
singleton getinstance(
string
caller)
return
instance;
}else
return
null;}
//記錄呼叫方呼叫次數
public
void
callercount(
string
caller)
public
bool
check(
string
caller)
}歡迎一起討論!
--------------------------補充-------------------------------
我把幾種流行的 singleton 寫法發出來,省的大家再去查資料。
public
sealed
class
mysingleton
//簡單寫法
public
static
mysingleton istance
return
instance;}}
//執行緒安全
static
readonly
object
obj
=new
object
();public
static
mysingleton safeinstance}}
//雙重鎖定 節約開銷
public
static
mysingleton lockinstance
}return
instance;}}
//靜態初始化
static
mysingleton()
static
readonly
mysingleton staticinstance
=new
mysingleton();
public
static
mysingleton staticinstance}//
延遲初始化
public
static
mysingleton lazyinstance
}class
lazy}}
java設計模式 單例模式(Singleton)
設計模式 design pattern 是一套被反覆使用 經過分類編目 設計經驗的總結。目的 為了可重用 讓 更容易被他人理解 保證 的可靠性。適用場景 有些物件我們只需要乙個,比如,配置檔案 工具類 執行緒池 快取 日誌物件等。作用 保證整個應用程式中某個例項有且只有乙個。餓漢式 public c...
(原創)無廢話C 設計模式之二 Singleton
無廢話c 設計模式之二 singleton 意圖 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。場景 我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分...
(原創)無廢話C 設計模式之二 Singleton
無廢話c 設計模式之二 singleton 意圖 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點。場景 我們現在要做乙個網路遊戲的服務端程式,需要考慮怎麼樣才能承載大量的使用者。在做web程式的時候有各種負載均衡的方案,不管是通過硬體實現還是軟體實現,基本的思想就是有乙個統一的入口,然後由它來分...