Singleton的C 实现 及相关问题
2008-02-23 05:24:09来源:互联网 阅读 ()
编程式的时候很多情况下需要当前的程式中只有一个object。例如一个程式只有一个和数据库的连接,只有一个鼠标的object。
最简单的方法是用个全局变量或用个静态变量。但这违反基本的Object Oriented Design 的原则,使程式执行的整体结构,可读性连同可维护大大下降。同时假如所编写的程式不是主程式而是dll的话全局变量的寿命更难控制。
Design Pattern 中最简单也是应用最广的就是Singleton, 就是用于解决这个问题的。下面是个简单的Singleton的C 的实现,应用这个class之后能够确保当前程式中只有一个copy 。
Class Singleton
{
public:
static Singleton * GetInstance()
{
static Singleton instance;
return &instance;
}
protected:
Singleton();
~Singleton();
}
由于constructor和destructor都是protected,所以无法直接生成这个class。使用时直接用 Singleton::GetInsgtance()就行了。不必操心Singleton的寿命。
另一种实现方法如下:
Class Singleton
{
public:
static Singleton * GetInstance()
{
if(!m_pInstance)
m_pInstance = new Singleton();
return pinstance;
}
private:
static Singleton *m_pInstance;
protected:
Singleton();
~Singleton();
}
这种写法的问题在于您需要在new 之后的适当时候delete 掉这个Instance。这个寿命很难控制。但有的人说这个实现是thread_safe的。
而第一个不是thread_safe 。
我瞧了N天也没有发现这个实现怎么thread safe。经多家讨论后证实这个实现合第一个相同不thread safe。两个进程同时进入GetInstance同时m_pInstance还是NULL,同时constructor花的时间特别长的时候就可能出事。要将其用在多进程的程式中的时候最好在GetInstance函数的开始和结束加上“Cretical Section”。
当我学完这一段的时候发现他竟然不能用在我的project里,因为我的project里要管理的这个object可能有几个copy(数量确定)。那么就需要把上面的概念稍微扩展一下。把static Singleton instance换成数组或vector。这样能够生成的数量是确定的。使用者不会因为多用几次GetInstance而改变了内存的管理。当然用户用GetInstance()的时候应该知道自己要Get哪个copy,给GetInstance()加个参数。稍微复杂一点。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 谈谈C 的程式规范--变量命名
下一篇: 菜鸟也能搞定C 内存泄漏
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash