单例模式
单例模式的介绍
Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的 getInstance()
工厂方法,让客户可以直接访问它的唯一实例。为了防止在外部对其实例化,需要将其默认构造函数和拷贝构造函数设计为私有化。在单例类内部定义了一个 Singleton 类型的静态对象,作为外部共享的唯一实例。
单例模式的使用
单例模式使用案例一
提示
在 C++ 中使用单例模式时,一般不用管单例对象的内存释放问题,也就是不需要编写自定义的析构函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| using namespace std;
class ChairMan {
private: ChairMan() { cout << "创建主席" << endl; }
ChairMan(const ChairMan &c) {
}
public: static ChairMan *getInstance() { return singleton; }
private: static ChairMan *singleton;
};
ChairMan *ChairMan::singleton = new ChairMan();
void test01() { ChairMan *man1 = ChairMan::getInstance(); ChairMan *man2 = ChairMan::getInstance(); cout << (man1 == man2 ? "true" : "false") << endl; }
int main() { cout << "---- main ----" << endl; test01(); return 0; }
|
程序运行的输出结果如下:
1 2 3
| 创建主席 ---- main ---- true
|
单例模式使用案例二
这里将使用单例模式,模拟公司员工使用打印机的场景,打印机可以打印员工要输出的内容,并且可以累积打印机的使用次数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <iostream> #include <string>
using namespace std;
class Printer {
private:
Printer() {
}
Printer(const Printer &p) {
}
public: void printText(string str) { cout << str << endl; times++; }
long getTimes() { return times; }
public: static Printer *getInstance() { return singleton; }
private: long times = 0;
static Printer *singleton; };
Printer *Printer::singleton = new Printer();
int main() { Printer *printer1 = Printer::getInstance(); Printer *printer2 = Printer::getInstance(); cout << (printer1 == printer2 ? "true" : "false") << endl;
printer1->printText("C++ Guilde"); printer1->printText("Think in Java"); long times = printer1->getTimes(); cout << "times = " << times << endl;
return 0; }
|
程序运行的输出结果如下:
1 2 3 4
| true C++ Guilde Think in Java times = 2
|