这个应该是比较简单的一个设计模式,也是我接触的第一个模式。要点是构造函数声明为私有,定义一个指向自己的静态指针,在合适的时候new一个对象。简单的代码如下:
1: class Singleton {
2: public:
3: static Singleton* instance()
4: {
5: if (_instance == NULL)
6: {
7: _instance = new Singleton;
8: }
9: return _instance;
10: }
11: private:
12: Singleton(){}
13: ~Singleton(){}
14:
15: private:
16: static Singleton* _instance;
17: };
18:
19: Singleton* Singleton::_instance = NULL;
仅仅是练习一下而已,没有实际的用处。实际代码中必须要有其他的成员变量和函数才能发挥功能。
首先一个问题是上面的代码线程不安全。static的东西,在多线程访问并“创建”的时候必须要加锁保护一下才行。一般用“双重锁定检查”来做,这里省略。
另外一个问题是如何释放资源。如果把析构函数设置为私有的,就不能显示去delete。如果设置为公共的,封装性又不太好,毕竟不应该谁都能删除一个公共的资源。一种建议的做法是再搞另一个对象来管理单体,在合适的时候让那个对象来删除单体资源,这里要用到友元类。单体一般生命周期都很长,很多代码几乎都不删除单体。
最后一个问题是单体可以用模板来自动生成,ACE就有这样的模板来生成单体。
没有评论:
发表评论