青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

SmartPtr
本博客已搬至:http://www.cnblogs.com/baiyanhuang/
posts - 29,comments - 176,trackbacks - 0
By SmartPtr(http://www.shnenglu.com/SmartPtr/)

     Singleton應(yīng)該可以算是GOF23個(gè)模式中最簡(jiǎn)單的一個(gè)模式了,它有兩個(gè)要求:一是保證一個(gè)類僅有一個(gè)實(shí)例;二是提供一個(gè)訪問它的全局訪問點(diǎn)。這在實(shí)現(xiàn)中分別對(duì)應(yīng)為:一是構(gòu)造函數(shù)非public;二是提供一個(gè)靜態(tài)函數(shù)作為全局訪問點(diǎn)。
  在
C#中,我們可以這么寫:
public class ExampleSingleton
{
    
// code to support Singleton
    protected ExampleSingleton(){}
    
protected static ExampleSingleton instance = new ExampleSingleton();

    
public static ExampleSingleton Instance
    {
        
get{return instance;}
    }

    
// This class's real functionalities
    public void Write(){Console.WriteLine("Hello, World!");}
}

// use this singleton class
ExampleSingleton.Instance.Write();
    類似的,C++中實(shí)現(xiàn)如下:
class ExampleSingleton
{
    
// code to support Singleton
protected:
        ExampleSingleton(){}
public:
    
static ExampleSingleton& Instance()
    {
        
static ExampleSingleton instance;
        
return instance;
    }

    
// This class's real functionalities
    void Write(){printf("Hello, World!");}
};

// use this singleton class
ExampleSingleton::Instance().Write();

    這樣寫的確符合了singleton的兩個(gè)要求,但是如果我們的系統(tǒng)中有許多個(gè)Singleton類,而對(duì)于每一個(gè)類,我們都要寫那些固定的,重復(fù)的代碼去支持其singleton的屬性。這不是一個(gè)好現(xiàn)象,我們希望可以把這些固定的代碼提取出來(lái),使我們的Singleton類只需要專注于實(shí)現(xiàn)其真正的功能,相信很多人都聽說過這個(gè)做法:Singleton模板基類。
對(duì)于C#:
// Singleton base class, each class need to be a singleton should 
// derived from this class
public class Singleton<T> where T: new()
{
    
    
// Instead of compile time check, we provide a run time check
    
// to make sure there is only one instance.
    protected Singleton(){Debug.Assert(null == instance);}
    
protected static T instance = new T();
    
public static T Instance
    {
        
get{return instance;}
    }
}

// Concrete singleton class, derived from Singleton<T>
public class ExampleSingleton: Singleton<ExampleSingleton>
{
    
// since there is no "freind class" in C#, we have to make
    
// this contructor public to support the new constraint.
    public ExampleSingleton(){}

    
// This class's real functionalities
    public void Write(){Console.WriteLine("Hello, World!");}
}

// use this singleton class
ExampleSingleton.Instance.Write();

這里,我們把為了支持Singleton功能的代碼提到一個(gè)Singleton<T>的類模板當(dāng)中,任何需要成為Singlton的類,只需從其派生便自然獲得Singleton功能。這里的一個(gè)問題是:為了支持模板類中的new()constraint,我們不得不把作為具體singleton類的派生類的構(gòu)造函數(shù)作為public,這就導(dǎo)致我們無(wú)法在編譯期阻止用戶自行new出第二個(gè),第三個(gè)實(shí)例來(lái),但我們可以在運(yùn)行期來(lái)進(jìn)行檢查進(jìn)而保證其實(shí)例的單一性,這就是這singleton基類構(gòu)造函數(shù)的作用:
protected Singleton(){Debug.Assert(null == instance);}

    當(dāng)然,有另外一種實(shí)現(xiàn)方法,那就是singleton基類不提供new() constraint, 這樣我們就可以讓ExampleSingleton的構(gòu)造函數(shù)為非public,在要?jiǎng)?chuàng)建T實(shí)例的時(shí)候,由于不能使用new, 我們用reflection反射出類型T的非public構(gòu)造函數(shù)并調(diào)用之。這樣,我們的確能保證編譯期實(shí)例的唯一性,但是由于用了反射,感覺代碼不是那么的簡(jiǎn)單優(yōu)雅,并且對(duì)其性能持保留態(tài)度,所以不太傾向與這種方法。
    但畢竟是越早檢查出錯(cuò)誤越好,所以大家如果有好的解決方案,不妨提出來(lái)一起討論討論。

 

而C++中由于提供了友元這個(gè)特性,實(shí)現(xiàn)起來(lái)要好一些:
// Singleton base class, each class need to be a singleton should 
// derived from this class
template <class T> class  Singleton
{
protected:
    Singleton(){}
public:
    
static T& Instance()
    {
        
static T instance;
        
return instance;
    }
};

// Concrete singleton class, derived from Singleton<T>
class ExampleSingleton: public Singleton<ExampleSingleton>
{
    
// so that Singleton<ExampleSingleton> can access the 
    
// protected constructor
    friend class Singleton<ExampleSingleton>;

protected:
        ExampleSingleton(){}
public:
    
// This class's real functionalities
    void Write(){printf("Hello, World!");}
};

// use this singleton class
ExampleSingleton::Instance().Write();

在C++友元的幫助下,我們成功實(shí)現(xiàn)了在編譯期保證實(shí)例的唯一性。(當(dāng)然,前提是你不要"亂交朋友")。

    有人可能會(huì)問,實(shí)現(xiàn)singleton的代碼并不多,我們沒必要搞這么一個(gè)機(jī)制來(lái)做代碼復(fù)用吧? 的確,我們復(fù)用的代碼并不是很多,但是,我想代碼復(fù)用的目的不僅僅是減少代碼量,其最重要的目的還是在于保持行為的一致性,以便于使用與維護(hù)。(用函數(shù)替換代碼段便是一個(gè)很好的例子)。
對(duì)于這里的singleton類來(lái)講,如果不做這個(gè)設(shè)計(jì),我們?cè)诿總€(gè)具體的singleton類內(nèi)部實(shí)現(xiàn)其singleton機(jī)制,那么可能出現(xiàn)的問題是
1. 很難保證其接口的一致性
張三寫了一個(gè)singleton類,全局訪問函數(shù)是Instance, 李四也寫了一個(gè)Singleton類,全局訪問函數(shù)可能就是GetInstance了。。。。。我們并沒有一個(gè)健壯的機(jī)制來(lái)保證接口的一致性,從而導(dǎo)致了使用的混亂性。

2. 不易維護(hù)
Singleton創(chuàng)建實(shí)例有兩種:一種為lazy initialization, 一種就是early initialization, 假如開始的實(shí)現(xiàn)是所有的singleton都用lazy initialization, 突然某種需求要求你用early initialization,你的噩夢(mèng)就開始了,你不得不重寫每一個(gè)singleton類。

而用了singleton模板基類這種機(jī)制,以上問題就不會(huì)存在,我們得到的不僅僅是節(jié)約幾行代碼:)

posted on 2007-07-17 23:54 SmartPtr 閱讀(1849) 評(píng)論(7)  編輯 收藏 引用

FeedBack:
# re: Singleton模式在C#與C++中的實(shí)現(xiàn)
2007-07-18 12:16 | ChenA
呵呵,這個(gè)模式叫CRTP。
local static不是線程安全的,哎,而且在c++ 08標(biāo)準(zhǔn)出來(lái)之前,singleton不可能是線程安全的。
singleton只能在單線程里用用,基本就是雞肋。
  回復(fù)  更多評(píng)論
  
# re: Singleton模式在C#與C++中的實(shí)現(xiàn)
2007-07-18 12:50 | SmartPtr
CRTP = the Curiously Recurring Template Pattern, 這里只是其應(yīng)用之一, 它還可以用于模擬虛函數(shù)等.
關(guān)于Singleton的線程安全,雖然我們可以寫一些代碼來(lái)做到(或看起來(lái)做到)線程安全,但是由于現(xiàn)在C++內(nèi)存模型的先天不足, 事實(shí)是無(wú)法做到。
  回復(fù)  更多評(píng)論
  
# re: Singleton模式在C#與C++中的實(shí)現(xiàn)
2007-07-18 14:22 | Afreet
@ChenA
小心的問一下,雙檢查加鎖模式呢……  回復(fù)  更多評(píng)論
  
# re: Singleton模式在C#與C++中的實(shí)現(xiàn)
2007-07-18 16:28 | eXile
雙重鎖同樣是不安全的,所以盡量不要采用lazy initialization,
對(duì)于early initialization, 一種安全的辦法可以參見:
http://www.shnenglu.com/eXile/archive/2006/09/27/13034.html  回復(fù)  更多評(píng)論
  
# re: Singleton模式在C#與C++中的實(shí)現(xiàn)
2007-07-18 17:07 | anders06
@ eXile
你是學(xué)Java的? 雙重鎖在C#里是安全的.
在Java里有人已經(jīng)寫了Singleton is evil  回復(fù)  更多評(píng)論
  
# re: Singleton模式在C#與C++中的實(shí)現(xiàn)
2007-07-18 17:26 | anders06
>>不得不把作為具體singleton類的派生類的構(gòu)造函數(shù)作為public,這就導(dǎo)致我們無(wú)法在編譯期阻止用戶自行new出第二個(gè)

你都說了你的弊端了,讓我怎么說你好呢:),還是老老實(shí)實(shí)寫吧,到目前為止我沒有找到個(gè)完美的方案.
他們說NGeneric中已經(jīng)有該功能的實(shí)現(xiàn),有空找來(lái)看看


  回復(fù)  更多評(píng)論
  
# re: Singleton模式在C#與C++中的實(shí)現(xiàn)
2007-07-18 18:34 | Afreet
eXile
回頭看看,確實(shí),DCLP由于編譯器,其匯編代碼是不確定一定能夠按序執(zhí)行的,所以同樣隱藏了線程安全問題;當(dāng)然在高并發(fā)情況下的瓶頸也是一個(gè)重要因素。

所以俺覺得類似于boost的early initialization可能更可取些。

至于Java中的Singleton,問題在于采用lazy initialization策略時(shí),如果沒有合理的同步,各個(gè)線程得到的實(shí)例可能不是同一個(gè)——而且這是由于JVM導(dǎo)致的,這就沒啥好法子了。C++可以用匯編寫線程庫(kù)控制代碼執(zhí)行順序,JVM呢?  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜片在线免费观看| 午夜精品成人在线视频| 欧美福利视频在线| 亚洲毛片播放| 一本一本久久a久久精品综合妖精| 欧美日韩影院| 欧美一区二区视频97| 久久精品日韩一区二区三区| 一区二区三区在线视频观看| 欧美大片一区二区| 欧美日韩综合在线免费观看| 久久aⅴ国产紧身牛仔裤| 久久久久久夜精品精品免费| 99精品福利视频| 午夜一区在线| 亚洲精品永久免费| 亚洲欧美日韩在线一区| 91久久精品美女高潮| 一区二区三区四区国产| 精品福利免费观看| 亚洲乱码国产乱码精品精天堂| 国产精品免费区二区三区观看| 香蕉成人啪国产精品视频综合网| 国产区二精品视| 欧美高清视频一二三区| 欧美视频免费| 蜜桃av一区二区| 国产精品拍天天在线| 欧美大片一区| 国产日韩精品视频一区| 亚洲欧洲免费视频| 好吊妞**欧美| 在线天堂一区av电影| 亚洲激情女人| 欧美与黑人午夜性猛交久久久| 日韩午夜一区| 久久亚洲精选| 久久久久久有精品国产| 欧美午夜剧场| 亚洲伦理自拍| 亚洲人成网站在线播| 久久精品国产99国产精品| 亚洲一区二区在线观看视频| 欧美大色视频| 你懂的视频欧美| 国产亚洲va综合人人澡精品| 一区二区欧美在线观看| 一区二区三区四区五区在线| 乱码第一页成人| 看欧美日韩国产| 国产视频一区在线| 亚洲新中文字幕| 亚洲一级片在线观看| 欧美精品色综合| 亚洲国产精品t66y| 亚洲国产激情| 免费观看在线综合色| 欧美aa国产视频| 1024成人网色www| 久久久久久综合| 免费亚洲视频| 最新成人av网站| 欧美激情国产高清| 亚洲精品日韩在线观看| 亚洲麻豆av| 欧美日韩伊人| 亚洲自拍偷拍网址| 午夜视频在线观看一区二区三区| 国产精品都在这里| 亚洲免费婷婷| 久久婷婷久久| 亚洲国产一区在线观看| 欧美大片在线观看一区二区| 亚洲黄色精品| 亚洲一区在线播放| 国产精品视频观看| 久久精品成人一区二区三区| 欧美国产视频日韩| 亚洲图片欧洲图片av| 国产精品热久久久久夜色精品三区| 亚洲欧美日本国产专区一区| 久久精品成人一区二区三区蜜臀| 极品日韩久久| 欧美精品三级日韩久久| 亚洲欧美日韩第一区| 免费国产自线拍一欧美视频| 亚洲精品1区2区| 欧美日韩亚洲国产一区| 欧美一区亚洲二区| 亚洲国产专区| 久久激情视频久久| 亚洲日本va午夜在线影院| 久久久九九九九| 国产一区二区看久久| 欧美成人午夜| 亚洲欧美精品在线观看| 免费在线视频一区| 亚洲综合99| 亚洲风情在线资源站| 国产精品成人一区二区三区吃奶 | 久久天天躁夜夜躁狠狠躁2022| 亚洲狠狠婷婷| 国产视频一区在线观看| 欧美激情区在线播放| 香蕉久久夜色精品国产| 亚洲精美视频| 狂野欧美激情性xxxx| 亚洲一区二区三区免费在线观看| 激情久久久久| 国产精品免费一区二区三区在线观看 | 国产欧美日韩一区| 欧美国产在线电影| 久久久久久久久久久久久女国产乱 | 国产精品二区在线| 欧美电影在线| 久久精品一本| 亚洲欧美日韩在线观看a三区| 91久久久在线| 欧美**人妖| 久久婷婷国产综合精品青草| 午夜在线a亚洲v天堂网2018| 日韩亚洲精品视频| 亚洲国产精品999| 国语自产在线不卡| 国产午夜精品美女视频明星a级| 欧美三级午夜理伦三级中文幕| 久久综合九色综合欧美就去吻 | 最新国产乱人伦偷精品免费网站| 久久精品综合一区| 久久高清一区| 久久av红桃一区二区小说| 亚洲中字黄色| 亚洲欧洲av一区二区| 亚洲一区精品视频| 亚洲一区二区三区四区五区午夜| 亚洲精品国久久99热| 最新日韩在线视频| 亚洲激情电影中文字幕| 在线观看视频一区二区| 曰韩精品一区二区| 亚洲国产精品日韩| 亚洲国产精品一区二区第一页| 狠狠色丁香婷婷综合| 国内揄拍国内精品久久| 国内精品美女在线观看| 狠狠久久五月精品中文字幕| 国产在线成人| 亚洲电影在线播放| 亚洲人成精品久久久久| 亚洲精品在线视频| 亚洲无人区一区| 亚洲色图在线视频| 欧美成在线视频| 欧美国产精品| 欧美日韩综合在线免费观看| 国产精品久久久久久久久久久久久久| 欧美日韩免费视频| 国产乱码精品一区二区三区忘忧草 | 欧美大片一区二区| 欧美特黄一区| 国产综合视频| 亚洲欧洲午夜| 亚洲欧美成人| 久久午夜精品一区二区| 亚洲国产成人精品视频 | 欧美一级片一区| 久久久久综合一区二区三区| 欧美凹凸一区二区三区视频| 亚洲日本在线视频观看| 亚洲一区二区三区中文字幕在线| 西西裸体人体做爰大胆久久久| 久久精品人人做人人综合| 欧美成人精品高清在线播放| 国产精品高清网站| 在线看成人片| 亚洲欧美另类综合偷拍| 久久天堂精品| 亚洲私人影院在线观看| 久久久一本精品99久久精品66| 欧美日韩精品免费观看视一区二区| 国产精品亚洲激情| 亚洲精品视频在线观看网站| 午夜综合激情| 亚洲人体一区| 久久久久久免费| 国产精品美女在线观看| 亚洲国产精品久久人人爱蜜臀 | 亚洲精品黄色| 久久久久九九九| 国产精品一区二区久激情瑜伽| 亚洲国产高清一区| 久久国产精品99国产精| 日韩视频免费在线| 久久综合色一综合色88| 国产精品卡一卡二| 一本色道久久88亚洲综合88| 米奇777超碰欧美日韩亚洲| 亚洲欧美一区二区激情| 欧美日韩一区二区免费在线观看| 一区二区在线视频观看|