类静态成员
对于特定类类型的全体对象而言,访问一个全局变量对象有时是必要的。然而,全局变量是破坏封装的,对象需要支持特定类抽象的实现。类可以定义类静态成员,而不是定义一个可普遍访问的全局变量。
类的static成员的优点:static成员的名字是在类的作用域中,因此可以避免与其他类的成员或者全局对象名字冲突;可以实施封装。static可以是私有成员,而全局对象不可以;通过阅读程序容易看出static成员是与特定类相关联的。
实现
由于要求只能生成一个实例,因此我们必须把构造函数设为私有函数以禁止他人创建实例。
单线程
Class Singleton
{
private:
static int number;
static Singleton * singleton;
Singleton();
public:
static Singleton * getSingle();
}
int number = 0;
Singleton singleton = NULL;
Singleton * getSingle()
{
if(number == 0)
{
singleton = new Singleton();
}
return singleton;
}
多线程
为了保证在多线程环境下还是只能得到类型的一个实例,需要加上一个同步锁。
Class Singleton
{
private:
static int number;
static Singleton * singleton;
static object syncObject *syncObj;//新建锁
Singleton();
public:
static Singleton * getSingle();
}
int number = 0;
Singleton * singleton = NULL;
Singleton * getSingle()
{
if(number == 0)
{
lock(syncObj);//第一次创建实例的时候加锁
if(number == 0){
singleton = new Singleton();
number = 1;
}
}
return singleton;
}