题目:设计一个类,我们只能生成该类的一个实例。

分析:由于要求类只能实例化一个唯一对象,我们要将类的构造函数私有化,避免别人直接通过类来创建对象。同时在类中声明一个指向这个唯一对象的指针,使用static关键字修饰为静态指针。

具体步骤

1.将类的构造函数私有化
2.类中声明指向类的指针,并在外部进行初始化
3.将类的指针私有化,并提供get方法访问这个指针
4.将拷贝函数私有化

 

代码实现

我的码云:https://gitee.com/hinzer/my-notes-of-C_plus/tree/master/step7

 

案例1:ChairMan

实现设计单例模型,保证只能实例化以为ChairMan对象。

#include "iostream"

using namespace std;

class ChairMan
{
private:
	ChairMan()
	{//1.私有化构造函数,防止外部直接使用类来创建实例
		cout << "ChairMan" << endl;
	}
	ChairMan(const ChairMan &c)
	{//私有化拷贝函数

	}
public:
		static ChairMan* getSingleMan()	//static方法只能获取static属性
		{//3.将指针私有化,通过这个函数获取指针的引用
			return singleMan;
		}
private:
	static ChairMan* singleMan;	//2.声明指向ChairMan的指针

};

ChairMan* ChairMan::singleMan = new ChairMan;	//2.在外部初始化这个指针,同时声明为全局

void test01()
{
	//指针是入口,通过getSingleMan方法返回指针的引用
	ChairMan* man1 = ChairMan::getSingleMan();
	ChairMan* man2 = ChairMan::getSingleMan();
	if (man1 == man2)
	{
		cout << "man1 与 man2相同" << endl;
	}
	else
	{
		cout << "man1 与 man2不相同" << endl;
	}

}

int main(int argc, char const *argv[])
{
	test01();
	return 0;
}

 

案例2:Printer

打印机模型,只有一个实例化的Printer对象。通过printText方法实现打印信息,并统计打印次数。

#include "iostream"
#include "string"

using namespace std;

class Printer
{//实现(单例)打印机类
private:
	Printer()
	{//1.私有化默认构造
		pnum = 0;	//初始化打印次数
	}
	Printer(const Printer &c)
	{//1.私有化拷贝构造

	}
public:
	static Printer* getInstance()
	{//3.获取指向实例的指针
		return singlePrinter;
	}

	void printText(string str)
	{//实现打印信息的方法,并统计打印次数
		cout << str << endl;
		
		pnum++;
		cout << "积累打印次数:"<< pnum << endl;
	}
private:
	static Printer* singlePrinter;	//2.声明指向Printer类的指针
	int pnum;
};

Printer* Printer::singlePrinter = new Printer;	//2.初始化指针,指向唯一实例

void test01()
{
	Printer* p = Printer::getInstance();	//p指向唯一实例
	p->printText("hello hinzer");

}

int main(int argc, char const *argv[])
{
	test01();
	return 0;
}

 

运行窗口