当前位置: 首页 > article >正文

【C/C++语言系列】实现单例模式

1.单例模式概念

定义:单例模式是一种常见的设计模式,它可以保证系统中一个类只有一个实例,而且该实例易于外界访问(一个类一个对象,共享这个对象)。
条件

  1. 只有1个对象
  2. 易于外界访问
  3. 共享这个对象
    使用情况:如果希望某个类只有一个对象,就可以使用单例模式。
    **案例:**windows的任务管理器,可以重复打开,但是只会出现一个

2.代码编写

class Person{
	
};

void test(){
	Person p1;
	Person p2;
	Person p3 = new Person;
}

正常代码框架如上所示,这样这个类就不止一个对象的,所以第一步:

  1. 将默认构造函数私有化:防止创建多个对象
class Person{
private:
	Person(){};
};

void test(){
	//Person p1;   //都不能创建了
	//Person p2;
	//Person p3 = new Person;
}

但是这样一个对象都没有了

  1. 只要拿到一个对象的指针即可,这个指针指向唯一的对象
class Person{
private:
	Person(){};
public:   //这个指针容易外界访问
	static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现
void test(){
	Person* c1 = Person::person;  //c1 == c2,它们指向相同
	Person* c2 = Person::person;
}

但是会出现一个问题:

c1 = NULL; //或者
Person::person = NULL;

那么这个类就访问不到了,因为权限太高,可以使用get、set方法。

  1. 将唯一的指针私有化,提供只读方法(不提供set方法)
class Person{
public:
	static Person* getInstance(){   //静态成员函数get方法(只能类去访问)
		return person;
	}
private:
	Person(){};
private:   //改为私有
	static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现
void test(){
	Person* p1 = Person::getInstance();
	Person* p2 = Person::getInstance();
}

但会出现以下问题:

Person* p3 = new Person(*p1); //拷贝构造,p3 != P1产生了新的对象
  1. 将拷贝构造函数私有化
class Person{
public:
	static Person* getInstance(){   //静态成员函数get方法(只能类去访问)
		return person;
	}
private:
	Person(){};  //默认构造函数私有化
	Person(const Person&){}  //拷贝构造函数私有化
private:   //改为私有
	static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现
void test(){
	Person* p1 = Person::getInstance();  //p1 == p2
	Person* p2 = Person::getInstance();
}

总结

单例模式是一种常见的设计模式,我们需要掌握它,一个补充,单例对象在main函数调用之前生成了(静态变量在编译阶段就分配了内存)


http://www.kler.cn/a/312972.html

相关文章:

  • LeetCode【0004】寻找两个正序数组的中位数
  • 鸿蒙UI开发——实现环形文字
  • 利用VMware workstation pro 17安装 Centos7虚拟机以及修改网卡名称
  • 青藤深度参编的终端安全国家标准正式发布
  • Elmo驱动器上位机软件的详细配置
  • 【学习笔记】SAP ABAP——内表
  • golang学习笔记23——golang微服务中服务间通信问题探讨
  • 【ShuQiHere】 探索 IEEE 754 浮点数标准:以 57.625 和 -57.625 为例
  • 【bugfix】-洽谈回填的图片消息无法显示
  • 0基础学习HTML(八)头部
  • PyCharm部分快捷键冲突问题
  • Pybullet 安装过程
  • 利士策分享,周末时光:一场自我充实的精致规划
  • python学习-10【模块】
  • C#开源的一个能利用Windows通知栏背单词的软件
  • 【修改Linux登录时欢迎信息】
  • 基于SpringBoot+Vue的宠物医院管理系统
  • Tomcat CVE-2017-12615 靶场攻略
  • 请求HTTP链接的图片等资源被自动变成HTTPS请求的问题解决(顺便可以解决图片防盗链)
  • 木舟0基础学习Java的第二十八天(常见的Java框架,MyBatis框架,动态SQL,缓存机制,多表关联查询,注释开发,逆向工程,LOG4J,Lombok)
  • VIVADO IP核之FIR插值器多相滤波仿真
  • flutter遇到问题及解决方案
  • OpenCV库学习之cv2.VideoWriter(函数)
  • 一起对话式学习-机器学习03——模型评估与模型选择
  • Lingo求解器基本语法
  • 基于ExtendSim的 电子制造 仿真模型