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

            Benjamin

            靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
            隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

            設(shè)計模式之Singleton(單件)模型

            Singleton(單件)模型:一個類只有一個實例。
            下面是C++代碼的單件模型:
            Class Singleton

               static Singleton s;
                int i; 
               Singleton(int x):i(x){} 
               Singleton& operator=(Singleton&);//賦值操作符 
               Singleton(const Singleton&);//拷貝構(gòu)造函數(shù),防止被用戶調(diào)用,聲明為私有
            public: 
               static Singleton& instance() 
               {return s;}//產(chǎn)生對象的引用 
               int getValue() {return i;} 
               void SetValue(int x)
               {i = x;}
             };

            Singleton Singleton::s(47);

            int main(){
               Singleton& s= Singleton::instance();
               cout << s.getvalue() <<endl;
               Singleton& s2 = Singleton::instance()'
               s2.setvalue(9);
               cout<<s.getvalue()<<endl;
            }
            創(chuàng)建單件的關(guān)鍵是防止程序員控制對象的生存期的權(quán)利,所以構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值操作符都要聲明為私有(本例中沒有實現(xiàn),因為賦值操作符和拷貝構(gòu)造沒用到),并且防止編譯器產(chǎn)生任何缺省的構(gòu)造函數(shù)。
            要注意的是,這里的對象可以靜態(tài)創(chuàng)建,也可以知道程序員根據(jù)需求顯式創(chuàng)建,這個創(chuàng)建的方式又稱為lazy initialzation,這個做法只有在創(chuàng)建的對象的代價不大,并且不總是需要它的情況下才有意義。上面的這個方法并沒有限制只創(chuàng)建一個對象,支持創(chuàng)建有若干對象的對象池。如果遇到對象池中共享對象的問題,則可以對進(jìn)出對象池的對象登記的方法解決。
            類中的static靜態(tài)成員都是一個單件,從這個意義上說,編程語言提供了對單件的直接支持,但是如果一個對象依賴于一個對象時,對象的正確初始化就很重要了。下面是對上面的示例代碼的改進(jìn)。
            #include <iostream>
            using namespace std;

            class Singleton{
               int i;
               Singleton(int x):i(x){}
               void operator=(Singleton&);
               Singleton(const Singleton&);
            public:
               static Singleton& intstance(){
               static Singleton s(45);
               return s;
              }
               int getValue() {retrun 1;}
               void setValue() {i = x;}
            }

            int maint()
            {
               Singleton& s= Singleton::instance();
               cout<<s.getValue() <<endl;
               Singleton s2=Singletonf::instance();
               s2.setValue(9);
               cout<<s.getValue<<endl;
            }
            下面是Scott Meyers兩個互相依賴的單間模型,由于是Scott Meyers創(chuàng)建,又稱Meyers單件。
             Class Singleton1{
                Singleton1(){}
            public: 
               static Singleton1& ref
               {
                   static Singleton1 single;
                   return single; 
               }
            };
             
            Class Singleton2{ 
               Singleton1 &s1; 
               Singleton2(Singleton1& s):s1(s){}
            public: 
               static Singleton2& ref()
               { 
                  static Singleton2 single(singleton1::ref)); 
                  return single; 
               }
                Singleton1& f()
               {return s1;};

            int main()

                  Singleton1& s1 = Singleton2::ref().f();//導(dǎo)致惟一的Singleton2對象創(chuàng)建,Singleton2創(chuàng)建中,Singleton1::ref()被調(diào)用,導(dǎo)致Singleton1對象創(chuàng)建。
             }

            Singleton-ness是單件模型的變體:利用遞歸模板實現(xiàn)。
            #include <iostream>
            using namespace std;

            template class Singleton

               Singleton(const Singleton&); 
               Singleton& operator= (const Singleton&); 
             protected: 
               Singleton(){} 
               vitrual ~Singleton()
               {}
            public: 
               static T& instance() 
               {
                  static T theInstance; 
                  return theInstance; 
               }
            };
             
            //Sample class to be made into a Singleton
            Class MyClass:public Singleton
            {
               int x;
            protected:
                friend class Singleton;
                MyClass() 
               { x = 0;}
            public: 
               void setValue(int n) 
               {x=n;}
            int getVlalue()const 
               {return x;}
            };

            int main()

               MyClass& m = MyClass::Instance(); 
               cout << m.getValue()<<endl;
               m.setValue(1);
               cout << m.getValue()<<endl;
            }
            Singleton<MyClass>為友元;Singleton不依賴MyClass的大小,實際上這只是對模板參數(shù)的靜態(tài)依賴。只有當(dāng)MyClass::Instance()被第一次調(diào)用時,才需要MyClass的大小。 單件模型實際應(yīng)用的很少。

            posted on 2009-04-09 21:28 Benjamin 閱讀(810) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            亚洲国产成人久久综合野外| 久久99国产精品二区不卡| 日韩一区二区久久久久久| 久久婷婷五月综合成人D啪| 国产69精品久久久久9999| 久久91精品国产91久久户| 久久狠狠高潮亚洲精品| 久久久国产乱子伦精品作者 | 亚洲国产精品成人久久蜜臀 | 久久综合久久久| 成人免费网站久久久| 久久亚洲高清观看| 国产精自产拍久久久久久蜜| 久久99国产精品成人欧美| 久久久久国色AV免费观看| 亚洲?V乱码久久精品蜜桃| 国产精品乱码久久久久久软件| 久久亚洲熟女cc98cm| 久久久久无码精品国产不卡| 国产精品青草久久久久婷婷| 狠狠精品久久久无码中文字幕 | 久久精品午夜一区二区福利| 精品少妇人妻av无码久久| 99国内精品久久久久久久| 亚洲а∨天堂久久精品| 久久精品国产亚洲αv忘忧草| 亚洲欧美伊人久久综合一区二区| 久久精品国产亚洲AV无码偷窥| 久久综合综合久久97色| 欧美久久一级内射wwwwww.| 无码人妻久久一区二区三区免费| 91久久精品91久久性色| 狠狠色丁香久久婷婷综合图片| 亚洲AV成人无码久久精品老人| 久久伊人精品青青草原高清| 亚洲欧美精品一区久久中文字幕 | 久久国产亚洲高清观看| 性高朝久久久久久久久久| 久久国产色AV免费看| 日韩中文久久| 国产激情久久久久影院|