• <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>

            那誰的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式

            作用:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。

            UML結(jié)構(gòu)圖:


            解析:
            Singleton模式其實(shí)是對全局靜態(tài)變量的一個(gè)取代策略,上面提到的Singleton模式的兩個(gè)作用在C++中是通過如下的機(jī)制實(shí)現(xiàn)的:1)僅有一個(gè)實(shí)例,提供一個(gè)類的靜態(tài)成員變量,大家知道類的靜態(tài)成員變量對于一個(gè)類的所有對象而言是惟一的 2)提供一個(gè)訪問它的全局訪問點(diǎn),也就是提供對應(yīng)的訪問這個(gè)靜態(tài)成員變量的靜態(tài)成員函數(shù),對類的所有對象而言也是惟一的.在C++中,可以直接使用類域進(jìn)行訪問而不必初始化一個(gè)類的對象.
            下面的實(shí)現(xiàn)其實(shí)是Singleton的一個(gè)簡單實(shí)現(xiàn),并不是特別的通用,一般的,如果一個(gè)項(xiàng)目中需要使用到Singleton模式比較多的話,那么一般會(huì)實(shí)現(xiàn)一個(gè)Singleton的模板類,模板類的模板參數(shù)是需要采用Singleton模式的類,比如這樣實(shí)現(xiàn):
            template<typename?T>
            class?Singleton
            {
            //.類的聲明
            }
            ;

            //?需要采用singleton模式的類
            class?Test
            ???:?
            public?Singleton<Test>
            {
            //?類的聲明
            }
            ;

            但是,下面的實(shí)現(xiàn)還是采用最簡單的實(shí)現(xiàn)辦法,起的是演示的作用

            實(shí)現(xiàn):
            1)Singleton.h
            /********************************************************************
            ????created:????2006/07/20
            ????filename:?????Singleton.h
            ????author:????????李創(chuàng)
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????Singleton模式的演示代碼
            ********************************************************************
            */


            #ifndef?SINGLETON_H
            #define?SINGLETON_H

            class?Singleton
            {
            public:
            ????Singleton()
            {};
            ????
            ~Singleton(){};

            ????
            //?靜態(tài)成員函數(shù),提供全局訪問的接口
            ????static?Singleton*?GetInstancePtr();
            ????
            static?Singleton??GetInstance();

            ????
            void?Test();

            private:
            ????
            //?靜態(tài)成員變量,提供全局惟一的一個(gè)實(shí)例
            ????static?Singleton*?m_pStatic;
            }
            ;

            #endif

            2)Singleton.cpp
            /********************************************************************
            ????created:????2006/07/20
            ????filename:?????Singleton.cpp
            ????author:????????李創(chuàng)
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????Singleton模式的演示代碼
            ********************************************************************
            */


            #include?
            "Singleton.h"
            #include?
            <iostream>

            //?類的靜態(tài)成員變量要在類體外進(jìn)行定義
            Singleton*?Singleton::m_pStatic?=?NULL;

            Singleton
            *?Singleton::GetInstancePtr()
            {
            ????
            if?(NULL?==?m_pStatic)
            ????
            {
            ????????m_pStatic?
            =?new?Singleton();
            ????}


            ????
            return?m_pStatic;
            }


            Singleton?Singleton::GetInstance()
            {
            ????
            return?*GetInstancePtr();
            }


            void?Singleton::Test()
            {
            ????std::cout?
            <<?"Test!\n";
            }

            3)Main.cpp
            /********************************************************************
            ????created:????2006/07/20
            ????filename:?????Main.cpp
            ????author:????????李創(chuàng)
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????Singleton模式的測試代碼
            ********************************************************************
            */


            #include?
            "Singleton.h"
            #include?
            <stdlib.h>

            int?main()
            {
            ????
            //?不用初始化類對象就可以訪問了
            ????Singleton::GetInstancePtr()->Test();
            ????Singleton::GetInstance().Test();

            ????system(
            "pause");

            ????
            return?0;
            }

            posted on 2006-07-21 14:27 那誰 閱讀(3771) 評論(7)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式

            評論

            # re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式   回復(fù)  更多評論   

            可以把Singleton(){};申明成protect,這樣避免調(diào)用者錯(cuò)誤的初始化
            2006-08-14 14:04 | rdcfeca

            # re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式   回復(fù)  更多評論   

            這個(gè)。。好像可以生成N多對象吧
            2009-03-03 14:18 | no

            # re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式   回復(fù)  更多評論   

            那個(gè)new出來的對象要在那里刪除那???
            2009-12-11 18:44 | palen

            # re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式   回復(fù)  更多評論   

            @palen
            那個(gè)不需要?jiǎng)h除,不是內(nèi)存泄漏
            2009-12-15 14:58 | Joshua Zhu

            # re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式   回復(fù)  更多評論   

            Singleton模式的用處是保證一個(gè)類只有一個(gè)唯一的實(shí)例,而且提供一個(gè)全局的訪問點(diǎn)。
            博主這個(gè)類可以生成很多對象,并沒有保證類的實(shí)例的唯一性。
            應(yīng)將構(gòu)造函數(shù)聲明為private 或者 protected
            2011-04-22 16:00 | zhanglistar

            # re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式   回復(fù)  更多評論   

            似乎簡化了很多哦 很感謝
            2011-06-16 13:57 | Skill

            # re: 常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式   回復(fù)  更多評論   

            @zhanglistar
            不會(huì)生產(chǎn)多個(gè)的,有static修飾,而且有null判斷。在構(gòu)造里加打印,可以看到只有一次打印。
            2013-10-30 11:01 | angelzlz
            无码精品久久久久久人妻中字| 大伊人青草狠狠久久| 青草影院天堂男人久久| 久久久久久久综合日本亚洲| 亚洲一区二区三区日本久久九| 久久99久久成人免费播放| 久久AV高潮AV无码AV| 成人资源影音先锋久久资源网| 国产亚州精品女人久久久久久 | 久久久久波多野结衣高潮| 色狠狠久久AV五月综合| 久久久久99精品成人片牛牛影视 | 久久精品成人免费看| 青青草国产97免久久费观看| 精品国际久久久久999波多野| 色综合久久88色综合天天 | 狠狠色丁香婷综合久久| 亚洲国产欧洲综合997久久| 久久99精品久久久久久9蜜桃| 色综合久久久久久久久五月| 国产999精品久久久久久| 欧美亚洲色综久久精品国产| 蜜桃麻豆WWW久久囤产精品| 国产精品美女久久久久AV福利 | 久久国产精品-国产精品| 中文精品久久久久人妻不卡| 色播久久人人爽人人爽人人片aV | 亚洲国产精品嫩草影院久久| 国产精品福利一区二区久久| 性做久久久久久久| 久久精品国产亚洲AV久| 亚洲国产精品嫩草影院久久| 婷婷久久综合| 久久久久久精品免费看SSS| 一本色道久久88综合日韩精品| 欧美久久久久久午夜精品| 国产精品成人久久久久三级午夜电影| 国产精品美女久久久久网| 久久青草国产精品一区| 99久久www免费人成精品| 久久久久国产视频电影|