C++-----单例模式及案例

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/XUCHEN1230/article/details/84970760