26.单例模式
1.视频内容
程序1:
#pragma warning(disable:4996)
//2022年9月30日20:00:15
#include <iostream>
using namespace std;
//单例模式是一个类只能实例化一个对象
class Maker
{
//1.把构造函数私有化
private:
Maker()
{
}
public:
//静态成员函数,访问静态成员变量
static Maker* getMaker()
{
return pMaker;
}
private:
static Maker* pMaker;
};
//3.在类外初始化,new一个对象
Maker *Maker::pMaker = new Maker;
void test()
{
//Maker m;
Maker* m = Maker::getMaker();
Maker* m2 = Maker::getMaker();
cout << "m = " << m << endl;
cout << "m2 = " << m2 << endl;
Maker m3 = *m;//调用拷贝构造
cout << "m3 = " << &m3 << endl;
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
输出结果:
m = 0000028D54580FF0
m 2 = 0000028D54580FF0
请按任意键继续. . .
程序2:
#pragma warning(disable:4996)
//2022年9月30日20:00:15
#include <iostream>
using namespace std;
//单例模式是一个类只能实例化一个对象
class Maker
{
//1.把无参构造函数和拷贝构造函数私有化
private:
Maker()
{
}
Maker(const Maker& m)
{
}
public:
//静态成员函数,访问静态成员变量
//4.把指针的权限设置为私有,然后提供一个静态成员函数让外面获取这个指针
static Maker* getMaker()
{
return pMaker;
}
private:
//2.定义一个类内的静态成员指针
static Maker* pMaker;
};
//3.在类外初始化,new一个对象
Maker *Maker::pMaker = new Maker;//这里可以new是因为有Maker::作用域,编译器这时把它当成在类内
void test()
{
//Maker m;
Maker* m = Maker::getMaker();
Maker* m2 = Maker::getMaker();
cout << "m = " << m << endl;
cout << "m2 = " << m2 << endl;
//Maker m3 = *m;//调用拷贝构造
//cout << "m3 = " << &m3 << endl;
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
程序3:
#pragma warning(disable:4996)
#include <iostream>
using namespace std;
#include <string>
//需要,获取打印机使用的次数
class Printer
{
private:
//1.把无参构造和拷贝构造私有化
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;//记录打印机打印的次数
//2.定义静态成员指针
static Printer* p;
};
//3.类外进行初始化,new对象
Printer *Printer::p = new Printer;
void test()
{
//销售部
Printer * p1 = Printer::getPrinter();
p1->printPrinter("销售部");
//技术部
Printer * p2 = Printer::getPrinter();
p2->printPrinter("技术部");
//公关部
Printer * p3 = Printer::getPrinter();
p3->printPrinter("公关部");
Printer * p4 = Printer::getPrinter();
cout << "打印机使用的次数:" << p4->getCount() << endl;
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
输出结果:
销售部:打印
技术部:打印
公关部:打印
打印机使用的次数:3
请按任意键继续. . .
2.单例模式(重点难点)
1.单例模式是一个类只能实例化一个对象
2.实现单例模式的思路
A.把无参构造函数和拷贝构造函数私有化
B.定义一个类内的静态成员指针
C.在类外初始化时,new一个对象
D.把指针的权限设置为私有,然后提供一个静态成员函数让外面获取这个指针
//单例模式是一个类只能实例化一个对象
class Maker
{
//1.把构造函数私有化
private:
Maker()
{
}
Maker(const Maker &m)
{
}
public:
//静态成员函数,访问静态成员变量
//4.把指针的权限设置为私有,然后提供一个静态成员函数让外面获取这个指针
static Maker* getMaker()
{
return pMaker;
}
private:
//2.定义一个类内的静态成员指针
static Maker *pMaker;
};
//3.在类外初始化时,new一个对象
Maker *Maker::pMaker = new Maker;//这里可以new是因为在Maker::作用域,编译器把它当成在类内
void test()
{
//Maker m;
Maker *m = Maker::getMaker();
Maker *m2 = Maker::getMaker();
cout << "m=" << m << endl;
cout << "m2=" << m2 << endl;
//Maker m3 = *m;//调用拷贝构造,这里会产生新对象,所以要把拷贝构造也私有化
//cout << "m3=" << &m3 << endl;
}
3.单例模式案例(需求:获取打印机打印次数)
//需求,获取打印机使用的次数
class Printer
{
private:
//1.把无参构造和拷贝构造私有化
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;//记录打印打印的次数
//2.定义静态成员指针
static Printer *p;
};
//3.类外进行初始化,new对象
Printer *Printer::p = new Printer;
void test()
{
//销售部
Printer *p1 = Printer::getPrinter();
p1->printPrinter("销售部");
//技术部
Printer *p2 = Printer::getPrinter();
p2->printPrinter("技术部");
//公关部
Printer *p3 = Printer::getPrinter();
p3->printPrinter("公关部");
Printer *p4 = Printer::getPrinter();
cout << "打印使用的次数:"<<p4->getCount() << endl;
}