程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++設計模式之Singleton

C++設計模式之Singleton

編輯:C++入門知識
一、功能   保證一個類僅有一個實例。   三、優缺點 Singleton模式是做為"全局變量"的替代品出現的。所以它具有全局變量的特點:全局可見、貫穿應用程序的整個生命期,它也具有全局變量不具備的性質:同類型的對象實例只可能有一個。   四、實現   教科書上的Singleton定義如下:
   class Singleton
  {
  public:
  static Singleton* Instance() ;
  protected:
  Singleton() {}
  private:
  static Singleton *_instance ;
  Singleton(const Singleton&) ;
  Singleton& operator=(const Singleton&) ;
  } ; Singleton* Singleton::_instance = NULL ; Singleton* Singleton::Instance()
  {
  (_instance == NULL) ? _instance = new Singleton() : 0 ; //lazy initialization
  return _instance ;
  }   (1)因為返回的是指針,為防止用戶調用delete函數,可把static Singleton *_instance;改為在Instance()中定義static Singleton _instance。這樣顯然更安全,同時也具有lazy initialization的特性(即第一次訪問時才創建)。
  
  (2)假設需要從Singleton派生子類,而子類也需要有同樣的性質,既只能創建一個實例。我覺得,這很難辦。根本原因在於Instance()函數不是虛函數,不具有多態的性質。一種常用方法是把Instance()函數移到子類中,這時就只能用static Singleton *_instance,而不能用static Singleton _instance了,除非把_instance也要移到子類,無論怎麼做都不優雅。另一種方法是用模板。具體用什麼方法,只能根據實際情況權衡。
  
  五、示例代碼   (1)沒子類的情況 namespace DesignPattern_Singleton
  { class Singleton
  {
  public:
  static Singleton* Instance() { static Singleton _instance ; return &_instance ; }
  protected:
  Singleton() {}
  private:
  Singleton(const Singleton&) ;
  Singleton& operator=(const Singleton&) ;
  } ;
  } 客戶端代碼:
  {
  using namespace DesignPattern_Singleton ;
  Singleton *p = Singleton::Instance() ;
  ......
  }   (2)有子類的情況
   方法一:
  namespace DesignPattern_Singleton
  {
  // class Singleton
  class Singleton
  {
  protected:
  Singleton() {}
  static Singleton *_instance ;
  private:
  Singleton(const Singleton&) ;
  Singleton& operator=(const Singleton&) ;
  } ;
  Singleton* Singleton::_instance = NULL ; // class ConcreteSingleton
  class ConcreteSingleton : public Singleton
  {
  public:
  static Singleton* Instance() ;
  protected:
  ConcreteSingleton() {}
  } ; Singleton* ConcreteSingleton::Instance()
  {
  (_instance == NULL) ? _instance = new ConcreteSingleton() : 0 ;
  return _instance ;
  }
  } 客戶端代碼:
  {
  using namespace DesignPattern_Singleton ;
  Singleton *p = ConcreteSingleton::Instance() ;
  } 方法二:
  namespace DesignPattern_Singleton
  {
  // class Singleton
  class Singleton
  {
  protected:
  Singleton() {}
  private:
  Singleton(const Singleton&) ;
  Singleton& operator=(const Singleton&) ;
  } ; // class ConcreteSingleton
  class ConcreteSingleton : public Singleton
  {
  public:
  static Singleton* Instance() { static ConcreteSingleton _instance ; return &_instance ; }
  protected:
  ConcreteSingleton() {}
  } ;
  } 客戶端代碼:
  {
  using namespace DesignPattern_Singleton ;
  Singleton *p = ConcreteSingleton::Instance() ;
  
   } 方法三:
  namespace DesignPattern_Singleton
  {
  template < class T >
  class Singleton
  {
  public:
  static T* Instance() { static T _instance ; return &_instance ; }
  protected:
  Singleton() {}
  private:
  Singleton(const Singleton &) ;
  Singleton& operator=(const Singleton&) ;
  } ; class ConcreteSingleton : public Singleton< ConcreteSingleton > {} ;
  } 客戶端代碼
  {
  using namespace DesignPattern_Singleton ; ConcreteSingleton *p = ConcreteSingleton::Instance() ;
  }
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved