假设我们电脑只有一个打印机,我们用一个类来管理打印机资源,如果像一般的类一样,使用者可以创建多个类的实例,那么势必会造成系统资源的大量浪费。此时,我们可以利用单例模式,只创建一个打印机对象。
#include <iostream>
using namespace std;
class SingletonPrinter
{
private:
static SingletonPrinter* instance;
public:
void show()
{
cout<<"这是一个唯一的打印机实例 ,实例地址:"<<this<<endl;
}
static SingletonPrinter* getInstance()
{
if(instance==0)
instance=new SingletonPrinter;
return instance;
}
private:
SingletonPrinter(){}
SingletonPrinter(const SingletonPrinter&);
SingletonPrinter& operator=(const SingletonPrinter&);
};
//初始化静态成员
SingletonPrinter* SingletonPrinter::instance=0;
int main()
{
SingletonPrinter* s=SingletonPrinter::getInstance();
s->show();
SingletonPrinter *s1=SingletonPrinter::getInstance();
s1->show();
delete s;
}
![](https://img-my.csdn.net/uploads/201210/19/1350620590_4026.png)
但是,问题是显而易见的,这个唯一实例应该什么时间释放呢?在网上搜了下,有2种解决方案。
1.内嵌一个垃圾清理类。
#include <iostream>
using namespace std;
class SingletonPrinter
{
private:
static SingletonPrinter* instance;
public:
void show()
{
cout<<"这是一个唯一的打印机实例 ,实例地址:"<<this<<endl;
}
static SingletonPrinter* getInstance()
{
//定义一个static对象,程序结束时,执行printerFree类的析构函数,从而释放唯一的实例对象。
//并且,如果该实例对象从未产生,这个垃圾回收对象也将不会产生
static printerFree pf;
if(instance==0)
instance=new SingletonPrinter;
return instance;
}
~SingletonPrinter()
{
cout<<"唯一的实例对象被销毁"<<endl;
}
private:
class printerFree
{
public:
~printerFree()
{
if(SingletonPrinter::instance!=0)
{
delete SingletonPrinter::instance;
cout<<"清理唯一的实例对象。"<<endl;
}
}
};
private:
SingletonPrinter(){}
SingletonPrinter(const SingletonPrinter&);
SingletonPrinter& operator=(const SingletonPrinter&);
};
//初始化静态成员
SingletonPrinter* SingletonPrinter::instance=0;
int main()
{
SingletonPrinter* s=SingletonPrinter::getInstance();
s->show();
SingletonPrinter *s1=SingletonPrinter::getInstance();
s1->show();
}
![](https://img-my.csdn.net/uploads/201210/19/1350622598_5216.png)
2.把实例对象定义成静态的。
#include <iostream>
using namespace std;
class SingletonPrinter
{
public:
void show()
{
cout<<"这是一个唯一的打印机实例 ,实例地址:"<<this<<endl;
}
static SingletonPrinter* getInstance()
{
static SingletonPrinter instance ;
return &instance;
}
~SingletonPrinter()
{
cout<<"唯一的实例对象被销毁"<<endl;
}
private:
SingletonPrinter(){}
SingletonPrinter(const SingletonPrinter&);
SingletonPrinter& operator=(const SingletonPrinter&);
};
int main()
{
SingletonPrinter* s=SingletonPrinter::getInstance();
s->show();
SingletonPrinter *s1=SingletonPrinter::getInstance();
s1->show();
}
![](https://img-my.csdn.net/uploads/201210/19/1350622712_6736.png)