论坛登陆 用户: 密码:
联系我们
设为首页
加入收藏
业界新闻 网络编程 程序开发 网页图象 聊天通讯 软件应用 网络安全 硬件学堂 教育频道 站长club
  ·推荐新闻
 
·美前任官员认为amd告倒英特
·搜索引擎关键字排行简介
·网站优化教程(一)
·msn近期遭受木马病毒骚扰 用
·用qq管理你的系统^_^ 
·测评中心金山毒霸联合发布7
·qq群聊实名 普通用户不受影
·雅虎思科联手推数字邮件签名
·这18条背下来没人敢和你忽悠
·自己动手,拯救丢失的硬盘数
  ·资料搜索
 
  ·相关文章
·深度探索c++对象模型(完结篇)
·深度探索c++对象模型(10)
·深度探索c++对象模型(9)
·深度探索c++对象模型(8)
·深度探索c++对象模型(7)
·深度探索c++对象模型(6)
·深度探索c++对象模型(5)
·深度探索c++对象模型(4)
·深度探索c++对象模型(3)
·深度探索c++对象模型(2)
  ·热门新闻
首页>>程序开发>>c/c++区>>文章正文

c++设计模式之singleton


 日期:2005-6-20 13:28:36     来源:易特网络技术   编辑:黑鹰  点击:
一、功能

  保证一个类仅有一个实例。

  二、结构图




 

 

 


  三、优缺点

  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() ;
}

上一篇:c++之静态联编和动态联编
下一篇:c++模式设计之builder
[发送给好友] [打印本页] [关闭窗口] [返回顶部转载请注明来源:http://www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 黑鹰 投稿作者: 易特网络
信息来源: 易特网络技术 录入时间: 2005-6-20 13:28:36
浏览次数: 投稿信箱: shtghy@163.com
设置首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights ©2004-2005 iyit.net all rights reserved. 网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息