• <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>
            Impossible is nothing  
              愛過知情重醉過知酒濃   花開花謝終是空   緣份不停留像春風(fēng)來又走   女人如花花似夢(mèng)
            公告
            日歷
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345
            統(tǒng)計(jì)
            • 隨筆 - 8
            • 文章 - 91
            • 評(píng)論 - 16
            • 引用 - 0

            導(dǎo)航

            常用鏈接

            留言簿(4)

            隨筆分類(4)

            隨筆檔案(8)

            文章分類(77)

            文章檔案(91)

            相冊(cè)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

             

            Singleton模式是常用的設(shè)計(jì)模式之一,但是要實(shí)現(xiàn)一個(gè)真正實(shí)用的設(shè)計(jì)模式卻也不是件容易的事情。

            1.         標(biāo)準(zhǔn)的實(shí)現(xiàn)

            class Singleton

            {

            public:

                   static Singleton * Instance()

                   {

                          if( 0== _instance)

                          {

                                 _instance = new Singleton;

                          }

                          return _instance;

                   }

            protected:

                   Singleton(void)

                   {

                   }

                   virtual ~Singleton(void)

                   {

                   }

                   static Singleton* _instance;

            };

                   這是教科書上使用的方法。看起來沒有什么問題,其實(shí)包含很多的問題。下面我們一個(gè)一個(gè)的解決。

            2.         自動(dòng)垃圾回收

            上面的程序必須記住在程序結(jié)束的時(shí)候,釋放內(nèi)存。為了讓它自動(dòng)的釋放內(nèi)存,我們引入auto_ptr改變它。

            #include <memory>

            #include <iostream>

            using namespace std;

            class Singleton

            {

            public:

                   static Singleton * Instance()

                   {

                          if( 0== _instance.get())

                          {

                                 _instance.reset( new Singleton);

                          }

                          return _instance.get();

                   }

            protected:

                   Singleton(void)

                   {

                          cout <<"Create Singleton"<<endl;

                   }

                   virtual ~Singleton(void)

                   {

                          cout << "Destroy Singleton"<<endl;

                   }

                   friend class auto_ptr<Singleton>;

                   static auto_ptr<Singleton> _instance;

            };

            //Singleton.cpp

            auto_ptr<Singleton> Singleton::_instance;

            3.         增加模板

            在我的一個(gè)工程中,有多個(gè)的Singleton類,對(duì)Singleton類,我都要實(shí)現(xiàn)上面這一切,這讓我覺得煩死了。于是我想到了模板來完成這些重復(fù)的工作。

            現(xiàn)在我們要添加本文中最吸引人單件實(shí)現(xiàn):

            /********************************************************************

                (c) 2003-2005 C2217 Studio

                Module:    Singleton.h

                Author:     Yangjun D.

                Created:    9/3/2005   23:17

                Purpose:    Implement singleton pattern

                History:

            *********************************************************************/

            #pragma once

             

            #include <memory>

            using namespace std;

            using namespace C2217::Win32;

             

            namespace C2217

            {

            namespace Pattern

            {

            template <class T>

            class Singleton

            {

            public:

                   static inline T* instance();

                  

            private:

                   Singleton(void){}

                   ~Singleton(void){}

                   Singleton(const Singleton&){}

                   Singleton & operator= (const Singleton &){}

             

                   static auto_ptr<T> _instance;

            };

             

            template <class T>

            auto_ptr<T> Singleton<T>::_instance;

             

            template <class T>

             inline T* Singleton<T>::instance()

            {

                   if( 0== _instance.get())

                   {

                          _instance.reset ( new T);

                   }

                  

                   return _instance.get();

            }

             

            //Class that will implement the singleton mode,

            //must use the macro in it's delare file

            #define DECLARE_SINGLETON_CLASS( type ) \

                   friend class auto_ptr< type >;\

                   friend class Singleton< type >;

            }

            }

             

            4.         線程安全

            上面的程序可以適應(yīng)單線程的程序。但是如果把它用到多線程的程序就會(huì)發(fā)生問題。主要的問題在于同時(shí)執(zhí)行_instance.reset ( new T); 就會(huì)同時(shí)產(chǎn)生兩個(gè)新的對(duì)象,然后馬上釋放一個(gè),這跟Singleton模式的本意不符。所以,你需要更加安全的版本:

            /********************************************************************

                (c) 2003-2005 C2217 Studio

                Module:    Singleton.h

                Author:     Yangjun D.

                Created:    9/3/2005   23:17

                Purpose:    Implement singleton pattern

                History:

            *********************************************************************/

            #pragma once

             

            #include <memory>

            using namespace std;

            #include "Interlocked.h"

            using namespace C2217::Win32;

             

            namespace C2217

            {

            namespace Pattern

            {

            template <class T>

            class Singleton

            {

            public:

                   static inline T* instance();

                  

            private:

                   Singleton(void){}

                   ~Singleton(void){}

                   Singleton(const Singleton&){}

                   Singleton & operator= (const Singleton &){}

             

                   static auto_ptr<T> _instance;

                   static CResGuard _rs;

            };

             

            template <class T>

            auto_ptr<T> Singleton<T>::_instance;

             

            template <class T>

            CResGuard Singleton<T>::_rs;

             

            template <class T>

             inline T* Singleton<T>::instance()

            {

                   if( 0 == _instance.get() )

                   {

                          CResGuard::CGuard gd(_rs);

                          if( 0== _instance.get())

                          {

                                 _instance.reset ( new T);

                          }

                   }

                   return _instance.get();

            }

             

            //Class that will implement the singleton mode,

            //must use the macro in it's delare file

            #define DECLARE_SINGLETON_CLASS( type ) \

                   friend class auto_ptr< type >;\

                   friend class Singleton< type >;

            }

            }

                   CresGuard 類主要的功能是線程訪問同步,代碼如下:

            /******************************************************************************

            Module:  Interlocked.h

            Notices: Copyright (c) 2000 Jeffrey Richter

            ******************************************************************************/

             

             

            #pragma once

            ///////////////////////////////////////////////////////////////////////////////

             

            // Instances of this class will be accessed by multiple threads. So,

            // all members of this class (except the constructor and destructor)

            // must be thread-safe.

            class CResGuard {

            public:

               CResGuard()  { m_lGrdCnt = 0; InitializeCriticalSection(&m_cs); }

               ~CResGuard() { DeleteCriticalSection(&m_cs); }

             

               // IsGuarded is used for debugging

               BOOL IsGuarded() const { return(m_lGrdCnt > 0); }

             

            public:

               class CGuard {

               public:

                  CGuard(CResGuard& rg) : m_rg(rg) { m_rg.Guard(); };

                  ~CGuard() { m_rg.Unguard(); }

             

               private:

                  CResGuard& m_rg;

               };

             

            private:

               void Guard()   { EnterCriticalSection(&m_cs); m_lGrdCnt++; }

               void Unguard() { m_lGrdCnt--; LeaveCriticalSection(&m_cs); }

             

               // Guard/Unguard can only be accessed by the nested CGuard class.

               friend class CResGuard::CGuard;

             

            private:

               CRITICAL_SECTION m_cs;

               long m_lGrdCnt;   // # of EnterCriticalSection calls

            };

             

             

            ///////////////////////////////////////////////////////////////////////////////

            5.         實(shí)用方法

            比如你有一個(gè)需要實(shí)現(xiàn)單件模式的類,就應(yīng)該這樣實(shí)現(xiàn):

            #pragma once

            #include "singleton.h"

            using namespace C2217::Pattern;

             

            class ServiceManger

            {

            public:

                   void Run()

                   {

                   }

            private:

                   ServiceManger(void)

                   {

                   }

                   virtual ~ServiceManger(void)

                   {

                   }

                   DECLARE_SINGLETON_CLASS(ServiceManger);

            };

             

            typedef Singleton<ServiceManger> SSManger;

             

            在使用的時(shí)候很簡(jiǎn)單,跟一般的Singleton實(shí)現(xiàn)的方法沒有什么不同。

            int _tmain(int argc, _TCHAR* argv[])

            {

                    SSManger::instance()->Run();

            }

             

            一個(gè)簡(jiǎn)單的Singleton模式的實(shí)現(xiàn),可以看到C++語言背后隱藏的豐富的語意,我希望有人能實(shí)現(xiàn)一個(gè)更好的Singleton讓大家學(xué)習(xí)。我從一開始實(shí)現(xiàn)Singleton類的過程,其實(shí)就是我學(xué)習(xí)C++的過程,越是深入越覺得C++了不起。

            posted on 2006-03-08 23:14 笑笑生 閱讀(496) 評(píng)論(1)  編輯 收藏 引用 所屬分類: C++語言
            評(píng)論:
            • # re: Singleton模式的演化[未登錄]  galaxy Posted @ 2007-05-16 15:08
              也準(zhǔn)備設(shè)計(jì)一個(gè)可以復(fù)用的單件模式的代碼

              不過要是能夠把單線程和多線程的單件分開就好了
              要是單線程中多次用到你的單件, 那么同步開銷就不值得了
              呵呵,準(zhǔn)備好好看看ace中的設(shè)計(jì)模式  回復(fù)  更多評(píng)論   

             
            Copyright © 笑笑生 Powered by: 博客園 模板提供:滬江博客
            精品永久久福利一区二区| 婷婷五月深深久久精品| 国产成人无码精品久久久免费| 91精品国产高清久久久久久91| 狠狠色丁香久久婷婷综合图片| 国产亚洲精午夜久久久久久| 国产精品青草久久久久婷婷| 久久水蜜桃亚洲av无码精品麻豆| 2020国产成人久久精品| 午夜不卡久久精品无码免费| 国内精品伊人久久久久影院对白 | 久久亚洲国产成人影院| 久久91精品国产91久久户| 久久天天躁狠狠躁夜夜网站| 久久五月精品中文字幕| 久久久久无码精品国产app| 久久精品国产精品亚洲人人| 99久久精品免费看国产一区二区三区 | 久久久国产精品福利免费| 99久久婷婷国产综合亚洲| 日日狠狠久久偷偷色综合0| 欧美大战日韩91综合一区婷婷久久青草 | 亚洲一级Av无码毛片久久精品| 久久精品无码一区二区三区免费| 久久精品人人做人人爽电影蜜月| 久久丫精品国产亚洲av| 久久精品日日躁夜夜躁欧美| 国产精品美女久久久久| 久久国产精品无码一区二区三区 | 久久精品18| 久久青草国产手机看片福利盒子| 久久ZYZ资源站无码中文动漫| 久久精品国产男包| 国产精品久久婷婷六月丁香| 久久久久久精品免费看SSS| 亚洲色大成网站WWW久久九九| 伊人久久大香线蕉av不变影院| 麻豆精品久久久久久久99蜜桃| 久久久久精品国产亚洲AV无码| 97精品伊人久久久大香线蕉| 色综合久久无码中文字幕|