日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式研究(二)-Singleton

發布時間:2025/3/21 asp.net 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式研究(二)-Singleton 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上篇:設計模式研究(一)實例比較TemplateMethod與Strategy

本篇先討論單件 Singleton,單件的目標是保證一個類型只有一個實例,那么由誰來保證實例的唯一性呢?可能的方案有:

a)調用端保證。
調用端調用一個類時,他是不需要也不會去考慮這個類是否已經被實例化的。而且把這樣的監管工作交給調用端是很不負責的做法。
b)類型內部保證。

類型內部如何保證?

將實例創建工作放到類型內部,這樣類型就可以將實例創建工作監管起來。類型可以知道內部的實例有沒有被創建,甚至可以知道創建實例的工作被執行了多少次。

所以個人認為理解單件需要分為兩步:

1、 監管工作誰來做?實例的監管工作需要類型自己去做。

2、 監管工作如何做?類型如何保證實例唯一就是技術實現問題了,可以看到的版本有 線程安全的、雙重鎖定的、延遲初始化的等。

下面使用偽代碼逐步分析實例化工作放到類型內部的做法。

?調用我,實例我給你

????class?Singleton
????{
????????Singleton?Instance?
=?null;
????????
// 實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?
=?new?Singleton();
????????????
return?Instance;
????????}

????}

你只管調用,我保證唯一

????class?Singleton
????{
????????Singleton?Instance?
=?null;
????????
//實例化類型?Singleton
????????Singleton?GetInstance()
????????{
????????????Instance?
=?new?Singleton();
????????????
return?Instance;
????????}
????????
//?實例化類型?Singleton,實例化時判斷類型有沒有被創建過,這樣就保證了實例的唯一
????????Singleton?GetInstance()
????????{
????????????
if?(Instance?==?null)
????????????{
????????????????Instance?
=?new?Singleton();
????????????}
????????????
return?Instance;
????????}

????}

你們都可以調用,我需要統計調用次數

class?Singleton
????{
????????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;
????????}

????}

想使用實例?請出示合法證件

class?Singleton
????{
????????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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。