版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XUCHEN1230/article/details/84970760
单例模式:
目的:为了让类中只有一个实例,实例不需要自己释放;
实现方法:
将 默认构造函数 和 拷贝构造函数 私有化;
内部维护一个 对象指针;
私有化唯一 指针;
对外提供 getInstance 方法来访问这个指针;
(此时外部已经没有任何方法来修改并创建新的对象)
保证类中只有一个实例化。
实例:
创建一个公司的主席;
需求:单例模式,创建类中的对象,并且保证只有一个这样的对象实例;
class ChairMan
{
public:
ChairMan(){}
};
void test01()
{
ChairMan c1;
ChairMan * c2 = new ChairMan; //在堆上创建;
ChairMan * c3 = new ChairMan;
//此时创建了三个chairman的对象,这不符合需求;
}
//*****************************************************************************************************************************************************
改进1:使其不能用new新建实例对象
class ChairMan
{
//1.构造函数:进行私有化;
//问题:将构造函数私有化了,如何去取用它?
//现在通过new的方式不能创建一个东西了。通过创建对象的方式不能取用它;
private:
ChairMan()
{
cout << "创建国家主席" << endl;
}
public:
static ChairMan * singleMan;
//声明一个静态变量,在类中声明,类外定义(初始化);
};
ChairMan * ChairMan::singleMan = new ChairMan;
//有作用域就还是相当于在类中进行初始化,调用构造;
void test01()
{
ChairMan::singleMan; //只有这一个主席了;
}
int main()
{
cout << "调用main" << endl;
test01;
return 0;
}
//程序运行结果:先"创建国家主席",后 "调用main"
//主席先于main的调用;
//证明,是在编译阶段就已经有了static的变量调用了构造函数;
//*****************************************************************************************************************************************************
改进2:对拷贝构造函数的处理:
class ChairMan
{
//1.构造函数:进行私有化;
//问题:将构造函数私有化了,如何去取用它?
//现在通过new的方式不能创建一个东西了。通过创建对象的方式不能取用它;
private:
ChairMan()
{
cout << "创建国家主席" << endl;
}
ChairMan(const ChairMan&c){}
//提供get方法来访问主席:
public:
static ChairMan * getInstance()
{
return singleMan;
}
private:
//当这个静态变量也变为私有权限时;
static ChairMan * singleMan;
//建议所有的属相都私有化,并对外提供接口;
};
ChairMan * ChairMan::singleMan = new ChairMan;
//有作用域就还是相当于在类中进行初始化,调用构造;
void test01()
{
ChairMan * cm1 = ChairMan::getInstance();//相当于只读形式,不能进行修改;
ChairMan * cm2 = ChairMan::getInstance();
if (cm1 == cm2) {
cout << "cm1 cm2 相同" << endl;
}
else {
cout << "cm1 cm2 不相同" << endl;
}
ChairMan * cm3 = new ChairMan(*cm2); //调用拷贝构造函数;
if (cm3 == cm2) {
cout << "cm3 cm2 相同" << endl;
}
else {
cout << "cm3 cm2 不相同" << endl;
}
}
int main()
{
//cout << "调用main" << endl;
test01();
return 0;
}
//结果cm1,cm2相同;cm2,cm3不相同;
//cm3相当于创建了一个新的变量;
所以此时,cm3还是创建了一个新的对象,继续改进:
//所以对于cm3,要把拷贝构造也私有化才行;
//如下:
class ChairMan
{
//1.构造函数:进行私有化;
//问题:将构造函数私有化了,如何去取用它?
//现在通过new的方式不能创建一个东西了。通过创建对象的方式不能取用它;
private:
ChairMan()
{
cout << "创建国家主席" << endl;
}
//拷贝构造私有化;
ChairMan(const ChairMan&c) {}
//提供get方法来访问主席:
public:
static ChairMan * getInstance()
{
return singleMan;
}
private:
//当这个静态变量也变为私有权限时;
static ChairMan * singleMan;
//建议所有的属相都私有化,并对外提供接口;
};
ChairMan * ChairMan::singleMan = new ChairMan;
//此时cm3就不能创建了。
打印机案例:
提供了一个打印功能和统计功能:
class Print
{
private:
Print() { m_Count = 0; } //私有化构造函数
Print(const Print &p); //私有化拷贝函数
static Print * singlePrint; //维护一个指针,唯一的print 指针;
int m_Count;
public:
static Print * getInstance()
{ //接口函数,getInstance;
return singlePrint ;
}
//实际用途:输出到屏幕上
void printText(string text)
{
cout << text << endl;
m_Count++;
cout << "打印机使用次数:" << m_Count << endl;
}
};
//静态私有化成员,类内声明,类外定义(实现)
Print * Print::singlePrint = new Print; //只能创建这样一个对象;
void test01()
{
Print * p1 = Print::getInstance(); //拿到打印机;
p1->printText("离职报告");
p1->printText("入职报告");
p1->printText("加薪报告");
p1->printText("升职报告");
p1->printText("退休报告");
}
int main()
{
test01();
system("pause");
return 0;
}