• <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)。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

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

            Singleton(單件)模型:一個類只有一個實(shí)例。
            下面是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ù),賦值操作符都要聲明為私有(本例中沒有實(shí)現(xiàn),因?yàn)橘x值操作符和拷貝構(gòu)造沒用到),并且防止編譯器產(chǎn)生任何缺省的構(gòu)造函數(shù)。
            要注意的是,這里的對象可以靜態(tài)創(chuàng)建,也可以知道程序員根據(jù)需求顯式創(chuàng)建,這個創(chuàng)建的方式又稱為lazy initialzation,這個做法只有在創(chuàng)建的對象的代價(jià)不大,并且不總是需要它的情況下才有意義。上面的這個方法并沒有限制只創(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是單件模型的變體:利用遞歸模板實(shí)現(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í)際上這只是對模板參數(shù)的靜態(tài)依賴。只有當(dāng)MyClass::Instance()被第一次調(diào)用時,才需要MyClass的大小。 單件模型實(shí)際應(yīng)用的很少。

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

            国产成人精品久久综合| 久久精品人人做人人妻人人玩| 中文精品久久久久人妻不卡| 久久久噜噜噜久久中文字幕色伊伊| 亚洲国产精品成人久久| 99久久精品费精品国产| 丁香色欲久久久久久综合网| 色偷偷久久一区二区三区| 久久夜色精品国产亚洲| 久久无码人妻一区二区三区| 精品999久久久久久中文字幕| 伊人久久久AV老熟妇色| 九九99精品久久久久久| 亚洲精品国产第一综合99久久 | 国产福利电影一区二区三区,免费久久久久久久精 | 久久精品国产亚洲5555| 狠狠狠色丁香婷婷综合久久俺| 久久播电影网| 久久AAAA片一区二区| 日韩人妻无码精品久久久不卡| 国产精品va久久久久久久| 日韩精品久久久久久免费| 品成人欧美大片久久国产欧美| 99久久99久久精品国产片果冻| 国产AV影片久久久久久| 久久久久久国产精品无码超碰| 久久久精品视频免费观看| 久久精品国产99国产电影网| 久久精品国产精品亚洲精品 | 久久久久这里只有精品| 久久亚洲天堂| 国产成人精品久久| 1000部精品久久久久久久久| 久久夜色tv网站| 国产人久久人人人人爽| 伊人色综合久久| 久久久91精品国产一区二区三区| 久久这里只有精品18| 日韩久久久久久中文人妻| 亚洲精品乱码久久久久久自慰 | 久久久久人妻精品一区二区三区|