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

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

By SmartPtr(http://m.shnenglu.com/SmartPtr/)

 

對于單件模式, 我想大家應(yīng)該都不陌生,它可以說是GOF23個設(shè)計模式中最簡單,最常用的一個模式了。但看似簡單的東西卻不一定好用,我就在使用時遇到了一個問題。

1 一個簡單的Singleton

#include<iostream>
class Singleton
{
public:
    
static  Singleton& GetSingleton()
    {
        
static Singleton singleton;
        
return singleton;
    }
    
void Print()
    {
        std::cout
<<"Singleton Print\n";
    }
private:
    Singleton::Singleton()
    {
        std::cout
<<"singleton constructor\n";
    }
};

這個類提供了一些的功能(函數(shù)Print), 并禁止我們創(chuàng)建這個類的對象(構(gòu)造函數(shù)為private), 提供給我們一個靜態(tài)函數(shù)接口來訪問這個單件對象(GetSingleton),利用靜態(tài)變量的特點實現(xiàn)了其單一性。但是, 這個類有問題嗎?
2 問題所在
是的,上面這個簡單的類的確存在問題,而且是一個很嚴(yán)重的問題,這個問題讓Singleton類完全失去它存在的意義, 因為它不再唯一!
是的, 當(dāng)我們只在一個模塊中使用這個類時(比如說,一個exe),這個類是沒有問題的。但是, 一個稍微復(fù)雜一點的軟件, 為了開發(fā)的便捷,提高復(fù)用度,降低耦合性等原因,其難免會被分成好幾個模塊。那么假設(shè)講我現(xiàn)在有兩個模塊,一個DLL(singleton.dll), 用來提供一些基礎(chǔ)的功能, 一個EXE(test.exe),用來提供真正的軟件邏輯。 我現(xiàn)在singleton.dll中封裝了一個Print的函數(shù)間(用類Singleton實現(xiàn))并暴露出來。

singleton.dll

void Print()
{
    Singleton::GetSingleton().Print();
}

并在test.exe中這樣調(diào)用:
Test.exe

Singleton::GetSingleton().Print();
Print();

這個時候,我們會發(fā)現(xiàn)在調(diào)用Singleton::GetSingleton().Print()時會產(chǎn)生一個Singleton對象, 而在調(diào)用Print()時, 也會產(chǎn)生一個Singleton對象, 也就是說我們有了兩個Singleton實例, singleton不再是singleton。那么,為什么會這樣呢。
static  Singleton& GetSingleton()
{
    static Singleton singleton;
    return singleton;
}

這個函數(shù)應(yīng)該只會在第一次調(diào)用時創(chuàng)建Singleton對象,無論如何, 不應(yīng)該出現(xiàn)會創(chuàng)建兩次, 調(diào)用兩次構(gòu)造函數(shù)的情況。對于靜態(tài)變量特性理解沒錯(只在第一次經(jīng)過時被初始化), 編譯器也沒問題(vc8.0),難道兩次經(jīng)過該靜態(tài)變量是都是第一次? 那么,難道兩次調(diào)用的GetSingleton函數(shù)并不是同一個函數(shù)?讓我們逐一來看:

1) Singleton::GetSingleton().Print()
在Test.exe中直接調(diào)用該函數(shù),因為包含的頭文件singleton.h有完整的實現(xiàn), 在鏈接時會在Test.exe保存一份Singleton::GetSingleton()的實現(xiàn)代碼。
將其標(biāo)為Singleton::GetSingleton_1();
2) Print();
Print()函數(shù)是從singleton.dll中導(dǎo)出而來的,而Print()會調(diào)用Singleton::GetSingleton(), 在鏈接模塊singleton.dll時,因為其包含的頭文件有完整的實現(xiàn), 這個DLL也會保存一份Singleton::GetSingleton()的執(zhí)行代碼。 我將它標(biāo)為Singleton::GetSingleton_2(), 雖然我們包含的是同一個頭文件,兩個是相同的函數(shù)名字, 但是這個函數(shù)在兩個不同的模塊中都存有一份獨立的實現(xiàn)。實際上, 他們已經(jīng)成為兩個不同的函數(shù)了。

看來,兩個函數(shù)的確不是同一個函數(shù)。

3 如何解決

既然知道了原因,就會有相應(yīng)的解決方法。既然我們知道有兩份獨立的代碼分別存在于兩個模塊中, 那么我們要做的就是讓它只有一份。最好的結(jié)果就是這個函數(shù)保存在dll中, 在Test.exe不再存有該函數(shù)的執(zhí)行代碼, 而是調(diào)用dll中的那個函數(shù)。現(xiàn)在結(jié)果很明顯了:將Singleton.h編譯鏈接singleton.dll并將外部需要使用的函數(shù)暴露出來。這樣,不管有多少模塊使用到singleton, 我們始終執(zhí)行singleton.dll中的代碼。

如下:
SINGLETON_API static Singleton& GetSingleton()
{
     static Singleton singleton;
     return singleton;
}
注:
#ifdef SINGLETON_EXPORTS
#define SINGLETON_API __declspec(dllexport)
#else
#define SINGLETON_API __declspec(dllimport)
#endif
這樣在test.exe中使用該函數(shù)時,就不會再產(chǎn)生一個副本了,從而保證了我們的應(yīng)用程序只有一個singleton實例

posted on 2007-08-28 11:37 SmartPtr 閱讀(1535) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(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>
            亚洲欧美精品中文字幕在线| 欧美大片免费久久精品三p| 亚洲人成网站777色婷婷| 亚洲精品美女免费| 蜜臀91精品一区二区三区| 一区二区在线不卡| 欧美激情一区二区三级高清视频| 欧美国产日韩一区| 亚洲一区综合| 最新亚洲视频| 欧美日韩在线另类| 亚洲成色最大综合在线| 亚洲精品久久久久久一区二区| 欧美久久精品午夜青青大伊人| 亚洲一区二区日本| 欧美激情中文字幕乱码免费| 欧美激情精品久久久六区热门| 亚洲国产精品传媒在线观看| 亚洲永久免费观看| 久久精品男女| 亚洲一区二区三区高清不卡| 国产专区综合网| 欧美手机在线| 国产偷自视频区视频一区二区| 免费不卡中文字幕视频| 亚洲女女女同性video| 亚洲欧美日本在线| 一区二区三区免费网站| 免费人成网站在线观看欧美高清| 久久综合久久88| 亚洲精品一区二区在线| 国产精品亚洲一区二区三区在线| 麻豆国产精品777777在线| 免费看av成人| 欧美一区午夜精品| 久久一区二区三区av| 美女被久久久| aa日韩免费精品视频一| 亚洲国产一区二区a毛片| 国产精品99久久久久久有的能看| 亚洲精品一区二区三区樱花| 亚洲欧美日韩中文播放| 欧美激情偷拍| 伊人男人综合视频网| 国产欧美日韩视频| 国产精品高清在线观看| 欧美日韩蜜桃| 在线观看视频一区二区| 欧美一区二区三区另类| 一区二区三区久久| 99re热这里只有精品免费视频| 在线成人免费观看| 欧美一区二区三区的| 亚洲国产一区在线观看| 久久久美女艺术照精彩视频福利播放| 欧美一区=区| 国产精品国产三级国产aⅴ浪潮 | 欧美全黄视频| 亚洲电影在线观看| 国产日韩精品综合网站| 99精品福利视频| 亚洲高清视频在线观看| 99国产欧美久久久精品| 欧美成人精品| 欧美日韩精品一区二区三区| 欧美日韩精品欧美日韩精品 | 一区二区三区精品在线| 亚洲第一综合天堂另类专| 欧美一区在线看| 黑人操亚洲美女惩罚| 在线看日韩欧美| 久久久久久尹人网香蕉| 欧美激情一区二区三区在线| 久久国产精品免费一区| 欧美日韩另类国产亚洲欧美一级| 亚洲精品偷拍| 999在线观看精品免费不卡网站| 亚洲自拍偷拍福利| 国产乱码精品一区二区三区av| 在线观看的日韩av| 国产精品一区二区三区久久| 1024亚洲| 在线一区二区日韩| 免费观看亚洲视频大全| 校园激情久久| 狠狠色综合色综合网络| 欧美一区亚洲| 欧美一区二区三区视频| 国内自拍视频一区二区三区| 久久综合五月| 欧美激情aaaa| 欧美成人免费播放| 亚洲视频图片小说| 久久人人97超碰国产公开结果| 欧美一级片在线播放| 好看的av在线不卡观看| 嫩模写真一区二区三区三州| 日韩一二三区视频| 国产精品免费看片| 亚洲免费观看| 久久免费高清| 免费影视亚洲| 亚洲影院在线观看| 久久精品五月婷婷| 国产精品资源在线观看| 久久网站热最新地址| 另类图片国产| 在线看国产一区| 一本大道久久a久久精品综合| 国产午夜亚洲精品不卡| 欧美激情91| 国产日产精品一区二区三区四区的观看方式 | 欧美在线一区二区| 亚洲人线精品午夜| 亚洲伊人一本大道中文字幕| 狠狠色丁香久久综合频道| 亚洲精品在线免费观看视频| 韩日在线一区| 亚洲一区二区三区三| 亚洲国产欧美一区二区三区久久| 亚欧成人在线| 亚洲视频香蕉人妖| 亚洲国产精彩中文乱码av在线播放| 日韩亚洲欧美成人一区| 激情欧美国产欧美| 午夜精品久久久久久久蜜桃app| 日韩午夜视频在线观看| 久久躁日日躁aaaaxxxx| 欧美在线观看视频一区二区| 欧美日韩一区二区欧美激情| 亚洲国产精品va在线观看黑人| 国产精品视频1区| 亚洲国产va精品久久久不卡综合| 欧美福利一区二区三区| 美日韩在线观看| 亚洲狼人综合| 免费不卡欧美自拍视频| 久久米奇亚洲| 国产亚洲欧美一区在线观看| 欧美亚洲网站| 欧美日本一区二区三区| 欧美二区在线看| 韩日欧美一区二区| 久久久久久综合| 美女国产精品| 亚洲福利精品| 噜噜爱69成人精品| 亚洲电影天堂av| 亚洲看片免费| 欧美日韩黄色大片| 一本久久青青| 久久国产精品99久久久久久老狼| 噜噜噜噜噜久久久久久91| 久久久久一区| 1000部国产精品成人观看| 久久久久免费观看| 欧美好骚综合网| 日韩亚洲欧美在线观看| 欧美日韩情趣电影| 亚洲欧美国产日韩天堂区| 久久本道综合色狠狠五月| 国产色视频一区| 久久免费午夜影院| 亚洲视频一二三| 国产精品成人观看视频免费| 亚洲婷婷综合色高清在线| 亚洲国产美女| 欧美日韩精品一本二本三本| 在线一区二区视频| 久久久国际精品| 国产精品久久久久aaaa九色| 中文在线资源观看网站视频免费不卡| 亚洲综合精品一区二区| 国产一区二区三区四区在线观看| 久久伊人一区二区| 亚洲欧洲日本在线| 黑丝一区二区| 欧美激情在线观看| 在线一区亚洲| 久久一区中文字幕| 亚洲视频免费看| 在线精品亚洲| 国产精品另类一区| 久久综合久久久久88| 一区二区三区视频观看| 久久综合狠狠| 亚洲免费中文字幕| 亚洲欧美日韩区| 亚洲国产日韩欧美综合久久| 亚洲——在线| 亚洲裸体视频| 国内成人精品一区| 欧美婷婷久久| 欧美国内亚洲| 久久综合色一综合色88| 午夜精品免费视频| 99re6热只有精品免费观看| 欧美成年人网| 久久日韩粉嫩一区二区三区| 亚洲综合首页|