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

news/2024/9/22 15:46:27 标签: 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.niftyadmin.cn/n/5670510.html

相关文章

信息安全数学基础(19)同余式的基本概念及一次同余式

一、同余式概念 同余式是数论中的一个基本概念,用于描述两个数在除以某个数时所得的余数相同的情况。具体地,设m是一个正整数,a和b是两个整数,如果a和b除以m的余数相同,则称a和b模m同余,记作a≡b(mod m)。反…

CSS从入门到精通(已完结)

关注作者微信公众号,开启探索更多 CSS 知识的精彩之旅。在这里,你将收获丰富的 CSS 专业内容,深入了解这一网页开发语言的奥秘,不断拓展你的知识边界,提升技能水平。快来关注吧! 微信公众号专栏地址&#x…

Flyway 基本概念

Flyway 基本概念详解 Flyway 是一款非常流行的数据库版本控制工具,专为管理数据库的变更而设计。它帮助开发者在项目开发过程中自动管理数据库的迁移与版本控制,确保数据库结构的变更和代码版本一致。Flyway 可以自动执行 SQL 脚本或 Java 代码来管理数…

C++容器list底层迭代器的实现逻辑~list相关函数模拟实现

目录 1.两个基本的结构体搭建 2.实现push_back函数 3.关于list现状的分析(对于我们如何实现这个迭代器很重要) 3.1和string,vector的比较 3.2对于list的分析 3.3总结 4.迭代器类的封装 5.list容器里面其他函数的实现 6.个人总结 7.代码附录 1.两…

IM项目-----用户信息子服务

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言数据管理模块mysql数据库管理redis数据库管理登录会话的管理登录状态的管理验证码的管理 ES数据管理创建索引 新增/更新数据查询索引 服务器搭建UserServer编写…

移动技术开发:ListView水果列表

1 实验名称 ListView水果列表 2 实验目的 掌握自定义ListView控件的实现方法 3 实验源代码 布局文件代码&#xff1a; activity_main.xml: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.androi…

如何使用 React、TypeScript、TailwindCSS 和 Vite 创建 Chrome 插件

创建一个 Chrome 插件是一个有趣的项目&#xff0c;特别是当结合使用强大的工具如 React、TypeScript、TailwindCSS 和 Vite 时 在这篇文章中&#xff0c;我们将逐步引导完成整个过程&#xff0c;了解如何在 2024 年构建自己的 Chrome 插件。无论是经验丰富的开发者还是刚刚起…

docker在基础镜像上,比如rockylinux,如何配置yum仓库

在基础镜像rockylinux上 启动的容器&#xff0c;没有yum仓库&#xff0c;就执行不了一些命令 ~]docker run -itd --name linux rockylinux:8.5~]# docker exec -it linux bash /]# ifconfig bash: ifconfig: command not found/]# vim bash: vim: command not found …