C++运用静态成员实现单例模式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中 某个类的对象只能存在一个,单例模式是最好的解决方案。
Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的
getInstance()
方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其默认构造函数和拷贝构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。
用单例模式,模拟公司员工使用打印机场景,打印机可以打印员工要输出的内容,并且可以累积打印机使用次数。
单例模式,只需要把握以下几点即可:
- 将 默认构造 和 拷贝构造 私有化(这样就不能通过构造函数来创建对象)
- 内部维护一个 静态对象指针(类内声明,类外实现,实现对象的唯一性)
- 私有化唯一指针(私有化之后无法通过外部对对象指针进行修改,实现真正的唯一)
- 对外提供
getInstance()
方法来访问这个指针(由于对象指针私有化,此方法用来给出接口获取唯一对象)
保证类中只能实例化唯一一个对象
class Printer{
public:
static Printer* getInstance(){ return pPrinter;}
void PrintText(string text){
cout << "打印内容:" << text << endl;
cout << "已打印次数:" << mTimes << endl;
cout << "--------------" << endl;
mTimes++;
}
//默认构造 和 拷贝构造 私有化
private:
Printer(){ mTimes = 0; }
Printer(const Printer&){}
private:
static Printer* pPrinter;
int mTimes;
};
Printer* Printer::pPrinter = new Printer;//静态对象指针的类外实现
void test(){
Printer* printer = Printer::getInstance();
printer->PrintText("离职报告!");
printer->PrintText("入职合同!");
printer->PrintText("提交代码!");
}
注:
new Printer
先于main函数调用,编译时就已经创建了