C++设计模式之Singleton

2016-02-19 20:53 2 1 收藏

有了下面这个C++设计模式之Singleton教程,不懂C++设计模式之Singleton的也能装懂了,赶紧get起来装逼一下吧!

【 tulaoshi.com - 编程语言 】

一、功能   保证一个类仅有一个实例。   三、优缺点 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() ;
  }

来源:https://www.tulaoshi.com/n/20160219/1624750.html

延伸阅读
一、 C++的设计目标(C++ Design Aims) C++的设计目标,就是要让C++既具有适合于系统程序设计的C语言所具有的可适应性和高效性,又能在其程序组织结构方面具有像Simula那样的语言设施(Simula所支持的这种程序组织结构通常被称为面向对象程序设计风格)。在设计的时候,还做了很大的努力,使得引借自Simula的高层次的程序设计技术能够...
本系列文章将向大家介绍一下 C#的设计模式 ,此为第十篇文章,相信对大家会有所帮助的。废话不多说,继续来看。 意图 运用共享技术有效地支持大量细粒度的对象。 场景 在比较底层的系统或者框架级的软件系统中,通常存在大量细粒度的对象。即使细力度的对象,如果使用的数量级很高的话会占用很多资源。比如,游戏...
本系列文章将向大家介绍一下 C#的设计模式 ,此为第十二篇文章,相信对大家会有所帮助的。废话不多说,继续来看。 意图 将抽象部分与实现部分分离,使它们都可以独立的变化。 场景 还是说我们要做的网络游戏,多个场景需要扩充的问题我们已经采用了创建型模式来解决。现在的问题就是,不仅仅是游戏场景会不断扩充...
本篇说明内容是C++中的要害,基本大部分人对于这些内容都是昏的,但这些内容又是编程的基础中的基础,必须具体说明。 数字表示 !-- frame contents -- !-- /frame contents -- 数学中,数只有数值大小的不同,绝不会有数值占用空间的区别,即数学中的数是逻辑上的一个概念,但电脑不是。考虑算盘,每个算盘...
C++
/*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout /*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout

经验教程

610

收藏

26
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部