so true

          心懷未來,開創未來!
          隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
          數據加載中……

          Singleton

          #include <iostream>

          namespace ImplMethod1 {

          //Singleton template implementation: Method 1
          template <typename T>
          class Singleton {
          public:
              static T* GetInstance() {
                  //You can consider thread-safe here if you will
                  static T* s_ptr = new T;
                  return s_ptr;
              }

          private:
              Singleton() {};
              virtual ~Singleton() {};
              Singleton(const Singleton&);
              Singleton& operator=(const Singleton&);
          };

          //How use it
          class MyClass {
          public:
              void func() {
                  std::cout << __PRETTY_FUNCTION__ << std::endl;
              }

          private:
              friend class Singleton<MyClass>;
              MyClass() {};
              ~MyClass() {};
              MyClass(const MyClass&);
              MyClass& operator=(const MyClass&);
          };

          // end of namespace ImplMethod1

          //---------------------------------------------------------------------------

          namespace ImplMethod2 {

          //Singleton template implementation: Method 2
          template <typename T>
          class Singleton {
          public:
              static T* GetInstance() {
                  //You can consider thread-safe here if you will
                  static T* s_ptr = new T;
                  return s_ptr;
              }

          protected:
              Singleton() {};
              virtual ~Singleton() {};

          private:
              Singleton(const Singleton&);
              Singleton& operator=(const Singleton&);
          };

          //How use it
          class MyClass: public Singleton<MyClass> {
          public:
              void func() {
                  std::cout << __PRETTY_FUNCTION__ << std::endl;
              }

          private:
              friend class Singleton<MyClass>;
              MyClass() {};
              ~MyClass() {};
          };

          // end of namespace ImplMethod2

          //---------------------------------------------------------------------------

          namespace ImplMethod3 {

          //Singleton template implementation: Method 3
          class LazyInstantiation {
          protected:
              template <typename T>
              static T* CreateInstance(T* dummy) {
                  //You can consider thread-safe here if you will
                  return new T;
              }
              virtual ~LazyInstantiation() {};
          };

          template <typename T, typename InstantiationPolicy = LazyInstantiation>
          class Singleton : public InstantiationPolicy {
          public:
              static T* GetInstance() {
                  //You can consider thread-safe here if you will
                  static T* s_ptr = InstantiationPolicy::CreateInstance((T*)NULL);
                  return s_ptr;
              }

          protected:
              Singleton() {};
              virtual ~Singleton() {};

          private:
              Singleton(const Singleton&);
              Singleton& operator=(const Singleton&);
          };

          //How use it
          class MyClass: public Singleton<MyClass> {
          public:
              void func() {
                  std::cout << __PRETTY_FUNCTION__ << std::endl;
              }

          private:
              friend class LazyInstantiation;
              MyClass() {};
              ~MyClass() {};
          };

          // end of namespace ImplMethod3

          //---------------------------------------------------------------------------

          /**
           * 分析:
           * 方法1不需要繼承,但不能直觀的通過MyClass::GetInstance來獲取實例,且在MyClass里需要將拷貝構造以及operator=聲明為private;
           * 方法2通過繼承的方式,比方法1好;
           * 方法3在方法2的基礎上,進行了巧妙的擴展,可以讓用戶自定InstantiationPolicy,可以支持一些有特殊構造函數的類;
           *
           * 結論:
           * 綜合來看,方法2簡單易用,方法3實現成本稍高,但比方法2又精進了一步。
           
          */
          int main(int argc, char* argv[]) {
              ImplMethod1::MyClass* p1 = ImplMethod1::Singleton<ImplMethod1::MyClass>::GetInstance();
              p1->func();

              ImplMethod2::MyClass* p2 = ImplMethod2::MyClass::GetInstance();
              p2->func();

              ImplMethod3::MyClass* p3 = ImplMethod3::MyClass::GetInstance();
              p3->func();
              return 0;
          }

          posted on 2015-07-03 11:57 so true 閱讀(325) 評論(0)  編輯  收藏 所屬分類: C&C++

          主站蜘蛛池模板: 伊春市| 青神县| 高邮市| 贞丰县| 南部县| 宜兴市| 林西县| 南丹县| 天峻县| 定南县| 牟定县| 西安市| 张北县| 兴安盟| 靖安县| 涟水县| 寻乌县| 绍兴市| 遂昌县| 大同市| 平定县| 海原县| 乌拉特后旗| 杂多县| 湾仔区| 色达县| 泰来县| 镇宁| 南乐县| 行唐县| 武鸣县| 丹东市| 中牟县| 阳泉市| 信阳市| 金塔县| 邢台县| 辽中县| 五大连池市| 关岭| 乐亭县|