Singleton模式C++实现

2014-11-24 00:56:19 · 作者: · 浏览: 3

Singleton是设计模式中比较简单的一个。园中的朋友们应该都很熟悉了。前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个。当时由于在有些地方考虑不太周全,代码出现了一些疏漏。不过最终写出了合格的实现。

Singleton模式
要求:

1、保证类只有一个实例

2、实例只能由类自身构造

3、必须为其他所有对象提供这一对象以访问。


由此,我们画出Singleton模式的结构图如下:

\

根据要求,类实例只能由自身构造,因此必须要控制构造函数(默认构造函数和拷贝构造函数)的访问权限(这里不考虑继承的问题)。

[cpp]
class Singleton{
private:
Singleton();
Singleton(Singleton &t);
};

class Singleton{
private:
Singleton();
Singleton(Singleton &t);
};

第一条,要求类只能有一个实例,因此必须防止客户出现拷贝或者复制的情况。

[cpp]
class Singleton{
private:
Singleton();
Singleton(Singleton &t);
Singleton& operator= (Singleton &rhs);
};

class Singleton{
private:
Singleton();
Singleton(Singleton &t);
Singleton& operator= (Singleton &rhs);
};

最终实现如下:

[cpp]
class Singleton{
public:
Singleton *Instance();
private:
static Singleton *instance;
Singleton();
Singleton(Singleton &t);
Singleton& operator =(Singleton& rhs);
};

Singleton* Singleton::instance = null;
Singleton* Singleton::Instance{
if(instance == null){
instance = new Singleton();
}
return instance;
}

class Singleton{
public:
Singleton *Instance();
private:
static Singleton *instance;
Singleton();
Singleton(Singleton &t);
Singleton& operator =(Singleton& rhs);
};

Singleton* Singleton::instance = null;
Singleton* Singleton::Instance{
if(instance == null){
instance = new Singleton();
}
return instance;
}

在上面的代码中,客户需要通过下面的方式取得单例对象

[cpp]
Singleton *ps = Singleton::Instance();

Singleton *ps = Singleton::Instance();
因为函数返回了一个对象的指针,如果客户失误调用delete操作符,则很容易出现错误甚至程序崩溃。因此可以修改Singleton::Instance()的实现:


[cpp]
class Singleton{
public:
Singleton *Instance();
private:
Singleton();
Singleton(Singleton &t);
Singleton& operator =(Singleton& rhs);
};

Singleton* Singleton::Instance{
static Singleton instance;
return &instance;
}

class Singleton{
public:
Singleton *Instance();
private:
Singleton();
Singleton(Singleton &t);
Singleton& operator =(Singleton& rhs);
};

Singleton* Singleton::Instance{
static Singleton instance;
return &instance;
}

这样更加安全,也体现了延迟创建的原则。


多态的实现

比较简单而且好用的方法是使用模板。


[cpp]
template
class Singleton{
public:
T* Instance(){ static T t; return &t; }
private:
Singleton();
Singleton(Singleton&);
Singleton& operator=(Singleton&);
};

template
class Singleton{
public:
T* Instance(){ static T t; return &t; }
private:
Singleton();
Singleton(Singleton&);
Singleton& operator=(Singleton&);
};

在定义C++类时,编译器会为我们自动创建一些函数(构造,析构,赋值操作符等),并且默认访问权限为public,如果不希望客户调用它,应该明确避免使用默认的实现,手动定义并限制其访问权限(Effective C++中的设计原则),在这个例子中得到了非常好的应用。