一、概述
单例模式是指一个类只能实例化一个对象
二、单例模式的实现
- 将构造函数和拷贝构造函数私有化
- 定义一个类内静态成员指针
- 在类外初始化,New一个对象
- 将指针权限设置为私有,然后提供一个静态成员函数让外面获取这个指针
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>
// 单例模式是一个类只能实例化一个对象
class Maker {
// 构造函数私有化 拷贝构造函数私有化 防止创建新的对象
private:
Maker()
{
}
Maker(const Maker &m)
{
}
public:
// 静态成员函数访问静态成员变量
static Maker* getMaker()
{
return pMaker;
}
private:
// 定义一个类内的静态成员指针
static Maker* pMaker;
};
Maker* Maker::pMaker = new Maker;// 初始化静态成员
void test01()
{
Maker* m = Maker::getMaker();
Maker* m1 = Maker::getMaker();
// 这两个地址都是一样的
cout << "m = " << m << endl;
cout << "m1 = " << m1 << endl;
//Maker m3 = *m;// 调用拷贝构造 地址不一样 所以将拷贝构造 也私有化 这样就没办法创建新的对象
//cout << "m3 = " << &m3 << endl;
}
int main()
{
test01();
return EXIT_SUCCESS;
}
三、单例模式案例
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>
// 单例模式是一个类只能实例化一个对象
class Printer
{
private:
// 将无参构造和拷贝构造私有化
Printer()
{
mcount = 0;
}
Printer(const Printer& p)
{
}
public:
static Printer* getPrinter()
{
return p;
}
void printPrinter(string name)
{
cout << name << "打印" << endl;
mcount++;
}
int getCount()
{
return mcount;
}
private:
int mcount;//记录打印的次数
// 定义静态成员指针
static Printer* p;
};
//类外进行初始化 New对象
Printer* Printer::p = new Printer;
void test01()
{
// 看起来获取的是三个对象 但是实际上都是同一个对象 mcount++三次
Printer* p1 = Printer::getPrinter();
p1->printPrinter("打印1");
Printer* p2 = Printer::getPrinter();
p2->printPrinter("打印2");
Printer* p3 = Printer::getPrinter();
p3->printPrinter("打印3");
}
int main()
{
test01();
return EXIT_SUCCESS;
}