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

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

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

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

               static Singleton s;
                int i; 
               Singleton(int x):i(x){} 
               Singleton& operator=(Singleton&);//賦值操作符 
               Singleton(const Singleton&);//拷貝構造函數,防止被用戶調用,聲明為私有
            public: 
               static Singleton& instance() 
               {return s;}//產生對象的引用 
               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;
            }
            創建單件的關鍵是防止程序員控制對象的生存期的權利,所以構造函數,拷貝構造函數,賦值操作符都要聲明為私有(本例中沒有實現,因為賦值操作符和拷貝構造沒用到),并且防止編譯器產生任何缺省的構造函數。
            要注意的是,這里的對象可以靜態創建,也可以知道程序員根據需求顯式創建,這個創建的方式又稱為lazy initialzation,這個做法只有在創建的對象的代價不大,并且不總是需要它的情況下才有意義。上面的這個方法并沒有限制只創建一個對象,支持創建有若干對象的對象池。如果遇到對象池中共享對象的問題,則可以對進出對象池的對象登記的方法解決。
            類中的static靜態成員都是一個單件,從這個意義上說,編程語言提供了對單件的直接支持,但是如果一個對象依賴于一個對象時,對象的正確初始化就很重要了。下面是對上面的示例代碼的改進。
            #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創建,又稱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();//導致惟一的Singleton2對象創建,Singleton2創建中,Singleton1::ref()被調用,導致Singleton1對象創建。
             }

            Singleton-ness是單件模型的變體:利用遞歸模板實現。
            #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的大小,實際上這只是對模板參數的靜態依賴。只有當MyClass::Instance()被第一次調用時,才需要MyClass的大小。 單件模型實際應用的很少。

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

            久久狠狠爱亚洲综合影院 | 久久成人国产精品| 99999久久久久久亚洲| 国产农村妇女毛片精品久久| 欧美亚洲另类久久综合婷婷| 久久亚洲美女精品国产精品| 久久精品国产亚洲av瑜伽| 97精品国产97久久久久久免费| 婷婷久久综合九色综合98| 久久这里只精品99re66| 久久久久久狠狠丁香| 久久影院综合精品| 伊人色综合久久天天人守人婷| 久久精品国产亚洲沈樵| 国产成人无码精品久久久性色 | 99久久成人国产精品免费| 最新久久免费视频| 久久e热在这里只有国产中文精品99 | 久久久久亚洲AV无码网站| 久久婷婷五月综合色99啪ak| 九九久久99综合一区二区| 久久亚洲精品成人AV| 亚洲人成无码久久电影网站| 国内精品久久久久久久coent| av国内精品久久久久影院| 久久av无码专区亚洲av桃花岛| 国产亚洲美女精品久久久2020| 亚洲人成无码网站久久99热国产| 国产免费久久久久久无码| 久久九九久精品国产免费直播| 韩国无遮挡三级久久| 色综合久久久久网| 国产免费福利体检区久久| 久久99精品国产麻豆不卡| 久久精品这里只有精99品| 久久久久婷婷| 久久精品国产精品亚洲精品 | 久久99国内精品自在现线| 97久久超碰国产精品旧版| 香港aa三级久久三级| 狠狠精品干练久久久无码中文字幕|