单例模式应该是GoF中最简单的设计模式,它是允许一个类有且仅有一个实例的方法。
所有的类都有构造方法,不显式定义的话系统会默认生成空的构造方法,若有定义的话,默认的构造方法就会失效。如果我们将类的构造方法写成是private的,那么外部程序就不能来实例化它了。
另外拷贝构造函数和复制构造函数被声明为私有,当然也没有实现。
那么怎么使用这个类呢,我们可以写一个public的方法,返回一个类实例,下面的代码中,instance()产生Singleton对象的引用。
如果返回的不是引用指针,用户可能会不小心删除此指针。
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton & instance()
{
return s;
}
int getValue()
{
return i;
}
void setValue(int x)
{
i = x;
}
private:
static Singleton s;
int i;
Singleton(int x)
:i(x)
{}
Singleton & operator= (Singleton &);
Singleton(const Singleton &);
};
Singleton Singleton::s(47);//静态变量类外初始化
int main(void)
{
Singleton & s = Singleton::instance();
cout << s.getValue() << endl;
Singleton & s2 = Singleton::instance();
s2.setValue(9);
cout << s.getValue() << endl;
return 0;
}
这里面还有一个静态变量类外初始化的问题,static 成员变量属于类,不属于某个具体的对象,这就意味着,即使创建多个对象,也只 分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了 ,也会影响到其他对象。
static 成员变量必须先初始化才能使用,否则链接错误。
初始化时可以不加 static,但必须要有数据类型。被 private、protected、public 修饰的 static 成员变量都可以用这种方式初始化。
静态成员变量必须初始化,而且只能在类体外进行
单例模式也可以很复杂,因为还有多线程的问题,我也没搞明白。
–《C++编程思想》,《大话设计模式》