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

            久久99国产精品久久99| 99精品国产99久久久久久97| 伊人久久大香线蕉av不卡| 久久996热精品xxxx| 精品久久国产一区二区三区香蕉 | 亚洲一级Av无码毛片久久精品| 久久综合中文字幕| 国产—久久香蕉国产线看观看| 色综合久久最新中文字幕| 国内精品久久久久久久久电影网| 国产午夜精品久久久久九九| 99久久免费只有精品国产| 久久国产成人| 亚洲成av人片不卡无码久久| 一级A毛片免费观看久久精品| 一本一道久久a久久精品综合 | 精品久久一区二区| 日本一区精品久久久久影院| 激情五月综合综合久久69| 国内精品久久久久影院亚洲| 新狼窝色AV性久久久久久| 久久久久久a亚洲欧洲aⅴ| 日本高清无卡码一区二区久久| 欧美精品乱码99久久蜜桃| 久久精品九九亚洲精品| 国产精品免费久久久久影院| 99久久国产亚洲综合精品| 99国产精品久久久久久久成人热| 欧洲性大片xxxxx久久久| 亚洲欧美成人综合久久久| 亚洲午夜久久影院| 人妻精品久久无码专区精东影业| 日本精品久久久中文字幕| 亚洲精品无码久久千人斩| 国产精品永久久久久久久久久 | 色欲综合久久中文字幕网| 久久精品国产亚洲一区二区三区| 亚洲国产一成人久久精品| 久久亚洲色一区二区三区| 久久精品国产一区| 国产亚洲精品自在久久|