## 模式定义:
单例模式确保一个类只有一个实例,并提供一个全局访问点。
## 模式结构:
![](https://box.kancloud.cn/2016-08-30_57c5458f38c59.jpg)
## 单例模式编程实现及执行结果:
~~~
#include <iostream>
using namespace std;
~~~
单例类
~~~
class Sigleton
{
public:
static Sigleton* getInstance();<span style="white-space:pre"> </span>//必须是static,否则无法调用getInstance
private:
Sigleton(){}
static Sigleton* uniqueInstance;
};
~~~
静态成员初始化
~~~
Sigleton* Sigleton::uniqueInstance = NULL;
~~~
成员函数实现
~~~
Sigleton* Sigleton::getInstance()
{
if(uniqueInstance == NULL)
{
uniqueInstance = new Sigleton();
}
return uniqueInstance;
}
~~~
客户代码
~~~
int main()
{
Sigleton* pSigleton1 = Sigleton::getInstance();
Sigleton* pSigleton2 = Sigleton::getInstance();
if(pSigleton1 == pSigleton2)
cout << "Sigleton Successful" << endl;
else
cout << "Sigleton failue" << endl;
return 0;
}
~~~
执行结果:
**Sigleton Successful**
**请按任意键继续. . .**
## 应用:创建Sigleton类的子类
我们应当考虑Sigleton的多个子类,而且应用必须决定使用哪一个子类。修改Sigleton方法如下:
单例基类
~~~
class Sigleton
{
public:
static Sigleton* getInstance(const char* name);
virtual void show(){cout << "Sigleton" << endl;}
protected: //基类构造函数访问权限位protected,使子类构造函数可以调用基类构造函数
Sigleton(){}
private:
static Sigleton* uniqueInstance;
}; <pre name="code" class="cpp">Sigleton* Sigleton::uniqueInstance = NULL;
Sigleton* Sigleton::getInstance(const char* name)
{
if(uniqueInstance == NULL)
{
if(strcmp(name,"SigletonA") == 0)
{
uniqueInstance = new SigletonA();
}
else if(strcmp(name,"SigletonB") == 0)
{
uniqueInstance = new SigletonB();
}
else
{
uniqueInstance = new Sigleton();
}
}
return uniqueInstance;
}
~~~
A类子类
~~~
class SigletonA : public Sigleton
{
//声明基类为友元,使其可以访问A类私有构造函数
friend class Sigleton;
public:
void show(){cout << "SigletonA" << endl;}
private:
SigletonA(){}
};
~~~
B子类
~~~
class SigletonB : public Sigleton
{
friend class Sigleton;
public:
void show(){cout << "SigletonB" << endl;}
private:
SigletonB(){}
};
~~~
客户代码
~~~
int main()
{
Sigleton* pSigleton1 = Sigleton::getInstance("SigletonA");
Sigleton* pSigleton2 = Sigleton::getInstance("SigletonA");
Sigleton* pSigleton3 = Sigleton::getInstance("SigletonB");
Sigleton* pSigleton4 = Sigleton::getInstance("SigletonB");
if(pSigleton1 == pSigleton2)
cout << "SigletonA Successful" << endl;
else
cout << "SigletonA failue" << endl;
pSigleton1->show();
pSigleton3->show();
return 0;
}
~~~
执行结果:
**SigletonA Successful**
**SigletonA**
**SigletonA**
**请按任意键继续. . .**