单例模式实现方法

1.什么是单例模式

单例模式就是一个类就只能创建一个对象

2.单例模式实现方法

一般情况下,构造函数都都在public下,默认的也在public下,这种情况下我们可以使用这个类创建任意多个对象;

1)如果我们把构造函数写在private下,那我们就不能用这个类创建对象

#include <iostream>
using namespace std;

class Cperson
{
private:
	Cperson()
	{
		cout << "Cperson" << endl;
	}
};



int main()
{
	Cperson per;

	system("pause");
	return 0;
}

编译报错:

如果不改变构造函数在private下,那我们应该如何操作来创建对象呢?做法就是:

2)通过静态成员函数来申请空间,并返回地址

#include <iostream>
using namespace std;

class Cperson
{
private:
	Cperson()
	{
		cout << "Cperson" << endl;
	}
public:
	static Cperson *creat()
	{
		return (new Cperson);
	}
};


int main()
{
	Cperson *per = Cperson::creat();

	system("pause");
	return 0;
}

执行结果:

为什么要写成静态函数成员呢?因为静态函数成员可以通过类的作用域来访问,同时因为此时不能创建对象,自然不能通过对象来访问函数成员,所以只能写成静态函数成员了,在静态函数返回一个地址时,new了一个新空间,所以执行了构造函数

这种方式虽然能创建了对象了,但是还是不能只创建一个对象,这种还是可以创建多个对象

3)定义一个静态标记,记录对象的个数,并控制

#include <iostream>
using namespace std;

class Cperson
{
private:
	Cperson()
	{
		cout << "Cperson" << endl;
	}
public:
	static bool Flag;
	static Cperson *creat()
	{
		if (Flag)
		{
			Flag = false;
			return (new Cperson);
		}
		else
			return NULL;
	}
};

bool Cperson::Flag = true;

int main()
{
	Cperson *per = Cperson::creat();
	delete per;

	Cperson *per1 = Cperson::creat();

	system("pause");
	return 0;
}

编译成功,但还是存在一个问题,这个问题就是,在创建一个对象后,就算我们delete了当前对象,但是我们还是不能创建新的对象

4)在析构函数中将标记清空,达到重新创建对象的目的

#include <iostream>
using namespace std;

class Cperson
{
private:
	Cperson()
	{
		cout << "Cperson" << endl;
	}
public:
	static bool Flag;
	static Cperson *creat()
	{
		if (Flag)
		{
			Flag = false;
			return (new Cperson);
		}
		else
			return NULL;
	}

	~Cperson()
	{
		Flag = true;
	}
};

bool Cperson::Flag = true;

int main()
{
	Cperson *per = Cperson::creat();
	delete per;

	Cperson *per1 = Cperson::creat();
	delete per1;

	system("pause");
	return 0;
}

执行结果:

3.注意

1)如果有其他构造函数构成重载,这些构造函数也要写在private下面,同时,赋值函数(运算符=的重载)、拷贝构造也要写在private下面

2)单例模式不唯一

3)构造函数等等写在protected下面也是单例

4)构造函数是私有的时,继承后,这个子类不能被实例化

猜你喜欢

转载自blog.csdn.net/qq_33757398/article/details/81417330
今日推荐