首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

设计模式里面的单件模式之疑问。该如何解决

2012-03-20 
设计模式里面的单件模式之疑问。写了个单件模式的简单例子,看了之后发现和标准的实现方式有很大区别,请大家

设计模式里面的单件模式之疑问。
写了个单件模式的简单例子,看了之后发现和标准的实现方式有很大区别,
请大家看看我这样写到底会有多少问题。我自己测试能简单用。

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

[解决办法]
探讨
11楼给的方法,和我看别人给的标准方法是一致的。
不过内存释放,好像有点问题。

[解决办法]
探讨
一般Singleton模式不是这样用的。
要实现Singleton模式通常要注意3个问题:
1. 构造函数是私有的
2. 实例变量是静态私有的
3. 一个静态公有的getInstance函数

所以楼主最好把在构造函数里定义的静态局部变量,放到private部分去声明比较好。下面是一个简单的例子,供参考:

C/C++ code
class Singleton
{
public:
static Singleton *getInstance() // 一个静态公有的getInstance函数
{


[解决办法]
推荐一个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

热点排行