• <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: 博客園 模板提供:滬江博客
            伊人久久免费视频| 精品国产热久久久福利| 亚洲精品乱码久久久久久不卡| 国产69精品久久久久9999| 99久久人人爽亚洲精品美女| 久久播电影网| 亚洲国产精品无码久久一线| 精品国产乱码久久久久久郑州公司| 91精品国产色综合久久| 久久精品亚洲乱码伦伦中文| 看全色黄大色大片免费久久久| 三级三级久久三级久久| 91精品国产9l久久久久| 久久只有这精品99| www.久久99| 亚洲欧美久久久久9999| 国产精品视频久久| 国产毛片欧美毛片久久久 | 久久高潮一级毛片免费| 国产精品成人久久久| 成人久久综合网| 亚洲色大成网站WWW久久九九| 国产精品久久波多野结衣| 国产精品久久久久久久久软件 | 伊人久久大香线蕉av不卡| 91精品国产9l久久久久| 亚洲午夜久久久久久久久电影网| 国产精品丝袜久久久久久不卡| 久久久www免费人成精品| 人人狠狠综合久久亚洲88| 国产精品久久久久国产A级| 亚洲欧洲久久久精品| 99国内精品久久久久久久| 国产精品久久波多野结衣| 久久国产精品无码HDAV | 亚洲精品tv久久久久| 国产精品免费看久久久香蕉| 久久国产乱子精品免费女| 国产精品久久久久影院嫩草| 日产精品久久久久久久| 亚洲AV日韩精品久久久久久 |