singleton模式中的static
Singleton模式的C++实现:
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* m_cpInstance;
};
Singleton* Singleton::m_cpInstance = NULL;
Singleton* Singleton::Instance()
{
if (NULL == m_cpInstance)
{
m_cpInstance = new Singleton();
}
return m_cpInstance;
}
我想问的是:
其中的Instance方法和m_cpInstance是不是必须用static的?
如果是,为什么呢?
如果不是,那么这样用有什么好处吗?
[解决办法]
必须是static,如果你没有创建对象,是不能使用它的非static成员的。static的成员实际是一般的变量和函数,只不过它们的作用域被限制在类范围之内。
[解决办法]
我来说几点:
1. 设计模式还是非常有意思的,要批判设计模式不是不可以,但总得说出具体的、真正的原因,而不能张口无视OO,闭口霸气;
2. 学习设计模式最重要的是掌握其精髓,欲掌握其精髓,往往需要通过编写代码来细细体会。
3. 楼主给出的Singleton实现是线程不安全的。关于Singleton模式,请看:http://topic.csdn.net/u/20100405/22/2adf595b-2f67-4f41-ba44-336faa702069.html?48167,后面有许多其他设计模式的C++实现。
[解决办法]
因为对于外部函数来说,只能通过调用Instance来得到这个唯一的实例。
这在编译的时候就是确定下来的。正因为如此,Singleton* Singleton::m_cpInstance = NULL;这句也不可以少。如果没有这句话,编译都不过。
为了达到“唯一”,只能用static,如果不用static,那么,用户就可以这样使用了:
Singleton a = new Instance();
Singleton b = new Instance();
这就不叫单实例模式了。
[解决办法]
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* m_cpInstance;
};
我也来说几句,这里从另一个角度给大家说一下:
1, 首先:protected:
Singleton();
这样申明的话,一个程序中可以有他的子类和他自己,就有了两
所以要将构造函数私有
2, public:
static Singleton* Instance();
这个方法必须有static,调用他的时侯没有类的实例对象,要是不加static就没有办法调用了.
3, private:
static Singleton* m_cpInstance;
这个加static是因为在Instance中要用到m_cpInstance,面Instance是static的.
static的方法是不能使用非static的成员的.所以m_cpInstance也要加上static
[解决办法]
因为要保证因为任何时刻 Singleton 类只允许一个实例,
且其的一些成员的状态属性需要长时间保持,
因此,
如果 m_cpInstance 必须是static,
static 对象的生命期为其构建到程序退出,
且staic只能被初始化一次,这样的就能保证
if( NULL!= m_cpInstance )
{ m_cpInstance = new Singleton;}
只会构建一个实例;
而只有static 函数访问 static成员,(也许效率上会好些?)
static Singleton* Instance();
[解决办法]
楼主,你的代码应该改成这样:[/code]
//Singleton模式的C++实现:
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
//static Singleton* m_cpInstance; //不要写在这个地方,因为不能保证初始化
};
Singleton* Singleton::Instance()
{
//现在改成这样
static Singleton value; //能保证初始化。
return &value;
}
[/code]
另外:
关于楼上各位的答复,我提出我的看法:
设计模式的作用就在于构造大型程序。
当你写一个大型程序时,如果是用C++写或者其他面向对象语言写的话,不用设计模式,
那么当你以后碰到需要更改设计,更改代码,或者移植代码,或者更改配置的时候,你将会发现你
突然寸步难行。因为很少用过设计模式,你的代码变得强耦合,模块之间关系不明确,更改一个地方牵涉到其他许多地方的更改,这时,你会突然需要一个好的解决方案,比如如何在不同的平台上使用不同的配置? 如何全局替换一个算法但不改变代码?如何将底层实现与界面显示分离,达到一个核心代码能够方便移植到不同的界面上?这就是一种设计模式。
对于喷设计模式的人,我不发表任何言论,各有所爱嘛!!反正设计模式的使用我个人是在自己的项目中收益匪浅,设计模式麻烦的地方就是对模式的理解和模式的建立,所以比一般的编程需要更多的时间和精力,但是建好模式后,修改和维护都很方便。
学习设计模式也便于我们理解一些C++开源项目的代码,很多开源项目的代码都用到了设计模式,或者说是设计模式的 C++ 版。。
从别人的设计模式代码中得到启发,然后用在自己的代码中,逐渐提升自己的设计功力,然后你会发现,其实那些设计模式正是前辈们以往设计经验的结晶,并逐渐体会一个模式对于解决项目中设计问题的巨大功力。当一个解决方案成熟的时候,以后碰到类似的问题,你都会找到相应的设计模式来解决了。
PS:有感而发,不要介意哟~~~。