设计模式里面的单件模式之疑问。
写了个单件模式的简单例子,看了之后发现和标准的实现方式有很大区别,
请大家看看我这样写到底会有多少问题。我自己测试能简单用。
- C/C++ code
class SingletonA{public: static SingletonA& Instance() { static SingletonA a; return a; } void aFun() { cout<<"SingletonA aFun"<<endl; } void Set(int i) { i_ = i; } void Get() { cout<<"i="<<i_<<endl; }private: SingletonA() { } SingletonA(const SingletonA& rhs) { } ~SingletonA() { } SingletonA& operator=(const SingletonA &rhs) { return *this; } int i_;};int _tmain(int argc, _TCHAR* argv[]){ SingletonA::Instance().aFun(); SingletonA::Instance().Set(10); SingletonA::Instance().Get(); return 0;}[解决办法]
你的_i有什么用?只是计数?
[解决办法]
看起来没什么问题。
[解决办法]
没看出什么问题~
有的用new在堆上创建唯一,你是创建一个static对象~
[解决办法]
除了线程同步问题以外, 其它都完美了。
我不得不说你的C++功力不错。
而且很有创意,优雅。看完你这个单件, 让我有种如淋春风的感觉。
我觉得看别人的代码就需要有这样的感觉。
[解决办法]
我个人觉得这样做每次调用类中的函数的时候都先要调用一次Instance()函数,而且不能用变量来表示这个类,感觉调用的时候有点繁琐
[解决办法]
一般Singleton模式不是这样用的。
要实现Singleton模式通常要注意3个问题:
1. 构造函数是私有的
2. 实例变量是静态私有的
3. 一个静态公有的getInstance函数
所以楼主最好把在构造函数里定义的静态局部变量,放到private部分去声明比较好。下面是一个简单的例子,供参考:
- C/C++ code
class Singleton{public: static Singleton *getInstance() // 一个静态公有的getInstance函数 { if( !m_pInstatnce) m_pInstance = new Singleton; return m_pInstance; }private: static Singleton *m_pInstatnce; // 实例变量是静态私有的private: // 构造函数是私有的 Singleton(); Singleton(const Singleton&); Singleton& operator=(const Singleton&); ~Singleton(); }
[解决办法]
static SingletonA& Instance()
{
static SingletonA a;
return a;
}
这个还是返回指针比较好:
static SingletonA* Instance()
{
static SingletonA a;
return &a;
}
[解决办法]
[解决办法]
[解决办法]
推荐一个heap上实现单件的方法。
单件一般不会出现memory leakage <<Effective C++>>
然而会有Resource leakage
为解决这个问题可以用STL中的auto_ptr或者用atexit()函数--《Modern C++ design》。
为解决线程同步问题可以使用1996年C++大师Douglas Schmidt提出的The Double-Checked Locking Pattern,当然这个方法要改进一下。
《Modern C++ design》和<<Head first design patterns>>都有一章来说明这个问题。
正如《Modern C++ design》所说, 这个世界上没有完美的单件(通用),只有在特定情况下最佳的实现。
[解决办法]
我的仅供参考
[code=C/C++][/code]
class Singleton
{
public :
static Singleton* Instance ( );
protected :
Singleton(){} //必须要有实现,会调用它,否则出错
private :
static Singleton *_instance ;
};
Singleton* Singleton::_instance = 0;
Singleton* Singleton::Instance ( )
{
if(_instance == 0)
{
_instance = new Singleton;
}
return (_instance);
}
int main(void)
{
Singleton *p1=Singleton::Instance();
Singleton *p2=Singleton::Instance();
getchar();
return 0;
}//注意最后的delete