特殊设计模式

news2024/9/27 23:21:57

▶实现一个类,不能被拷贝
▶实现一个类,只能在堆上创建
❗实现一个类,只能创建在栈上
❗设计一个不能继承的类
❗单例模式——一个类只能生成一个对象
  ❔饿汉模式——在每次程序启动都会自动生成一个对象
  ❓懒汉模式——在第一次需要的时候创建

🔱实现一个类,不能被拷贝

拷贝可能需要调用拷贝构造,operator=

class CopyBan
{
public:
	// c++11
	CopyBan() = default;
	CopyBan(const CopyBan&) = delete;
	CopyBan& operator=(const CopyBan&) = delete;
private:
	// c98
	// CopyBan(const CopyBan&);
	// CopyBan& operator=(const CopyBan&) ;
};

第一种采用c++11delete关键字
第二种采用c++98声明成私有的方式实现


🔱实现一个类,只能在堆上创建

因为new HeapOnly() 需要调用默认构造函数,所以不能将默认构造函数禁掉,需要将默认构造函数管理起来
new HeapOnly(...) 可能调用有参构造,拷贝构造

// 设计一个只能创建在堆上的类
class HeapOnly
{
public:
	static HeapOnly* CreateObject(); 
private:
	// 因为new HeapOnly() 需要调用默认构造函数,所以不能将默认构造函数禁掉,需要将默认构造函数管理起来
	// new HeapOnly(...) 可能调用有参构造,拷贝构造
	// 
	HeapOnly()
	{
		cout << "HeapOnly()" << endl;
	}
	// HeapOnly* b = new HeapOnly;
	// HeapOnly a(b); 这种是创建在栈上
	// 所以为了严格管理创建在堆上,需要不能写HeapOnly(const HeapOnly*);
	HeapOnly(const HeapOnly&) = delete;
	HeapOnly& operator=(const HeapOnly&) = delete;
};
HeapOnly* HeapOnly::CreateObject()
{
	return new HeapOnly();
}
  1. 堆上创建对象,都是需要通过new进行创建
  2. 可能会想返回值是new的对象能不能表示创建在堆上???
    答案是不能;返回值是堆上的对象,只能说返回的是堆上的对象,但是你自己的这个对象还是栈上开辟的

🔱实现一个类,只能创建在栈上

无参构造是需要的——需要在栈上创建
但是不能在堆上创建,所以不能使用new StackOnly,这个会调用默认构造函数,所以要将默认构造函数管理起来
只需要将new禁掉就行了,还有delete

// 设计一个只能创建在栈上的类
class StackOnly
{
public:
	void* operator new(size_t size) = delete;
	void operator delete(void* p) = delete;
private:
	// 无参构造是需要的——需要在栈上创建
	// 但是不能在对上创建,所以不能使用new StackOnly,这个会调用默认构造函数,所以要将默认构造函数管理起来

	// 只需要将new禁掉就行了,还有delete
};

🔱设计一个不能继承的类

需要明确继承是需要默认调用父类的构造函数——默认构造,有参构造,拷贝构造,operator=
所以需要将这写函数管理起来,首先不能将这些函数禁掉,所以就需要手动管理起来

c++98的方式

默认构造,有参构造,拷贝构造,operator= 写成private

class NonInherit
{
public:
	// 需要明确继承是需要默认父类的构造函数——默认构造,有参构造,拷贝构造,operator=
	// 所以需要将这写函数管理起来,首先不能将这些函数禁掉,所以就需要手动管理起来
	// c++11 的方式 final这个方法更好,支持在堆上创建,而且使用final编译器会有报错
	// c++98 的方式 private
private:
	// 如果使用c++98的方式,这个类就不能在堆上创建对象了,所以不太好,需要换种方式
	NonInherit();
	NonInherit(const NonInherit&);
	NonInherit& operator=(const NonInherit&);
};

在这里插入图片描述

如果使用private方式,这个类就不能在堆上创建对象,所以不太好,需要换种方式

我们额外在多想一下,为什么不能将父类构造函数分别放到protect,private中,子类使用protect,private继承

  1. 对于public,protect 属性取与继承方式范围小的那个
    比如说,protect属性+private继承方式=子类中private可见——父类protect属性成员转变成子类的private成员;public属性也是类似
  2. 对于private属性使用任何继承方式在子类中都是不可见的——就像爸爸的私有物品,儿子使用什么方式都是看不到的

这也是为什么不将父类构造函数写成protect的原因,所以将父类构造函数写成private属性很安全
不懂的可以看一下这个文章——各种继承方式在子类中的可见性


c++11的方式

定义父类名使用final

class NonInherit final
{
public:
	// 需要明确继承是需要默认父类的构造函数——默认构造,有参构造,拷贝构造,operator=
	// 所以需要将这写函数管理起来,首先不能将这些函数禁掉,所以就需要手动管理起来
	// c++11 的方式 final这个方法更好,支持在堆上创建,而且使用final编译器会有报错
	// c++98 的方式 private
private:
	// 如果使用c++98的方式,这个类就不能在堆上创建对象了,所以不太好,需要换种方式
	//NonInherit();
	//NonInherit(const NonInherit&);
	//NonInherit& operator=(const NonInherit&);
};

在这里插入图片描述

c++11 的方式 final这个方法更好,支持在堆上创建,而且使用final编译器会有报错


🔱单例模式——一个类只能生成一个对象

饿汉模式——在每次程序启动都会自动生成一个对象

比如在某个服务器程序中,该服务器的配置
信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再
通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。

// 饿汉模式
class Singleton_hunger
{
	// 在程序运行起来就已经准备好了对象,并且这个对象只能有一个
public:

	Singleton_hunger(const Singleton_hunger&) = delete;
	Singleton_hunger& operator=(const Singleton_hunger&) = delete;
	// 这个函数必须是static,如果普通函数,就需要先有对象才能访问函数,但是不能创建对象——必须是static
	static Singleton_hunger* GetSingleton_hunger()
	{
		return &tem;
	}
private:
	Singleton_hunger()
	{
		cout << "Singleton_hunger" << endl;
	}
	// 静态成员也受访问区域限制
	static Singleton_hunger tem;
};
Singleton_hunger Singleton_hunger::tem;

静态成员可以调用构造函数


懒汉模式——在第一次需要的时候创建

如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取
文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,
就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式(延迟加载)更好。

// 懒汉模式
class Singleton_lazy
{
	// 懒汉模式——在需要的时候创建,并且符合单例模式
public:
	Singleton_lazy(const Singleton_lazy&) = delete;
	Singleton_lazy& operator=(const Singleton_lazy&) = delete;
	// 这个函数必须是static,如果普通函数,就需要先有对象才能访问函数,但是不能创建对象——必须是static
	static Singleton_lazy* GetSingleton_lazy()
	{
		if (tem == nullptr)
			tem = new Singleton_lazy;
		return tem;
	}
private:
	Singleton_lazy()
	{
		cout << "Singleton_lazy" << endl;
	}
	static Singleton_lazy* tem;
};
Singleton_lazy* Singleton_lazy::tem = nullptr;

在懒汉模式中需要需要使用指针来记录对象

  1. 可以使用nullptr表示没有初始化,一举两得,可以省去用另一个变量标记是否初始化
  2. 另一个原因
	static Singleton_lazy GetSingleton_lazy()
	{
		if (_flag == 0)
		    tem = Singleton_lazy();
		return tem;
	}

在这里插入图片描述
单例模式并未结束,后来会添加线程知识

本次学习到此就结束了,只是讲了最基本的设计模式,还有很多设计模式需要我们去学习,加油!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1482692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有

202435读书笔记|《半小时漫画中国史》——读点经济学与历史&#xff0c;生活更美好&#xff0c;趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有 1. 土地政策、度量衡及税收2. 商鞅变法3. 西汉经济4. 西汉盐铁大辩论5. 西汉丝绸之路 《半小时漫画中国史&#xff1a;经济…

​MPV,汽车产品里一个特殊品类的进化过程

「汽车」可能是整个工业革命以来&#xff0c;所诞生出的最有趣的工业产品。 它不仅能产生工业的机械美&#xff0c;还诞生了一个独立的文化体系&#xff0c;在汽车的发展过程中&#xff0c;我们也能看到一些本来应功能而诞生的产品&#xff0c;最终走向了千家万户。 MPV 就是…

Qt5.9.9交叉编译(带sqlite3、OpenSSL)

1、交叉编译工具链 这里ARM平台是ARM CortexA9的&#xff0c;一般交叉编译工具链demo板厂商都会提供&#xff0c;若未提供或想更换新版本的交叉编译工具链可参考以下方式获取。 1.1 下载适用于ARM CortexA9的交叉编译工具链 Linaro Releases下载gcc4的最新版xxxx-i686_arm-li…

使用 Docker 部署 Fiora 在线聊天室平台

一、Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录&#xff0c;可以长久保存你的数据加入现有群组或者创建自己的群组&#xff0c;来和大家交流和任意人私聊&#xff0c;并添…

Cocos Creator 3.8.x 后效处理(前向渲染)

关于怎么开启后效效果我这里不再赘述&#xff0c;可以前往Cocos官方文档查看具体细节&#xff1a;后效处理官网 下面讲一下怎么自己定义一个后处理效果&#xff0c;想添加自己的后效处理的话只需要在postProcess节点下添加一个BlitScreen 组件即可&#xff0c;然后自己去添加自…

ElasticSearch搜索引擎使用指南

一、ES数据基础类型 1、数据类型 字符串 主要包括: text和keyword两种类型&#xff0c;keyword代表精确值不会参与分词&#xff0c;text类型的字符串会参与分词处理 数值 包括: long, integer, short, byte, double, float 布尔值 boolean 时间 date 数组 数组类型不…

div在vue的组件之中如何设置这个字体的颜色和样式大小

在Vue组件中设置<div>的字体颜色和样式大小可以通过两种主要方式实现&#xff1a;通过内联样式&#xff08;inline styles&#xff09;或者通过CSS类&#xff08;CSS classes&#xff09;。 使用内联样式 在Vue模板中直接在元素上使用style属性来设置样式。这种方法适用…

2024年春招小红书前端实习面试题分享

文章目录 导文面试重点一、方便介绍一下&#xff0c;你之前实习都做了什么嘛&#xff1f;二、 可以讲一下封装组件相关逻辑嘛&#xff1f;1. 为什么要封装组件&#xff1f;2. 封装组件的步骤3. 封装组件的原则4. 组件的复用和扩展5. 组件的维护和文档 三、项目的性能优化你有什…

Apache Echarts介绍与入门

介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html 入门案例 Apache Echarts官方提供的快…

大数据智能化-长视频领域

随着数字化时代的到来&#xff0c;长视频领域的发展迎来了新的机遇和挑战。在这一背景下&#xff0c;大数据智能化技术的应用成为长视频行业提升用户体验、优化运营管理的重要手段之一。本文将从优爱腾3大长视频背景需求出发&#xff0c;分析静态资源CDN、视频文件存储与分发、…

midjourney提示词语法

更高级的提示可以包括一个或多个图像URL、多个文本短语和一个或更多个参数 Image Prompts 可以将图像URL添加到提示中&#xff0c;以影响最终结果的样式和内容。图像URL总是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的图像的文本描述。…

[法规规划]国家数据局局长刘烈宏《激活数据要素价值》演讲要点解析

国家数据局党组书记、局长刘烈宏在北大光华论坛上发表了题为《激活数据要素价值》的演讲&#xff0c;当时曾极大推动了市场热度&#xff0c;引发了行业思考。现在演讲过去了一段时间&#xff0c;但是温故而知新&#xff0c;我们不妨结合演讲之后的市场反应&#xff0c;回顾一下…

Redis的主从搭建

1.准备两台机器&#xff0c;安装好redis 2.修改从服务器的redis配置 slaveof <masterip> <masterport>两个参数 masterip 主的ip 主的端口号 masterport 3. 启动redis 1.先启动主机redis 2.再启用从机redis 主机redis日志打印 从机redis 日志打印

有序数组二分查找

#include <stdio.h>//二分查找 int binary_search(int arr[],int k,int n){int low 0;int high n - 1;int mid 0;while(low < high){mid (low high) / 2;if(arr[mid] > k)high mid - 1;else if(arr[mid] < k)low mid 1;else return mid;}if(low > hi…

Tomcat服务部署、优化

一 Tomcat的基本介绍 Tomcat概念 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。 当在一台机器上配置好Apache 服务器…

Ubuntu Mysql Innodb cluster集群搭建+MaxScale负载均衡(读写分离)

Ubuntu系统版本 20.04.3 LTS (Focal Fossa) 、64位系统。 cat /etc/os-release查看Ubuntu系统是32位还是64位 uname -m如果显示“i686”,则表示安装了32位操作系统。如果显示“x86_64”,则表示安装了64位操作系统。 一、安装MySql 参考: https://blog.csdn.net/qq_3712…

【Datawhale组队学习:Sora原理与技术实战】Sora技术原理

Sora能力边界探索 最大支持60秒高清视频生成&#xff0c;以及基于已有短视频的前后扩展&#xff0c;同时保持人物/场景的高度一致性如奶茶般丝滑过渡的视频融合能力同一场景的多角度/镜头的生成能力具有动态摄像机运动的视频。随着摄像机的移动和旋转&#xff0c;人和其 他场景…

JVM相关面试题(2024大厂高频面试题系列)

一、JVM的组成 1、JVM由哪些部分组成&#xff0c;运行流程是什么&#xff1f; 回答&#xff1a;在JVM中共有四大部分&#xff0c;分别是Class Loader&#xff08;类加载器&#xff09;、Runtime Data Area&#xff08;运行时数据区&#xff0c;内存分区&#xff09;、Execut…

mybatisPlus中 Mapper层以及Service层的方法 整理分类 以及代码实操

MyBatis-Plus是一个基于MyBatis的增强工具&#xff0c;旨在简化开发、提高效率。它提供了通用的mapper和service&#xff0c;可以在不编写任何SQL语句的情况下&#xff0c;快速实现对单表的CRUD、批量、逻辑删除、分页等操作。 功能代码测试前提&#xff1a; 需要对mybatisPl…

【重要公告】对BSV警报系统AS的释义

​​发表时间&#xff1a;2024年2月15日 由BSV区块链协会开发并管理的BSV警报系统&#xff08;Alert System&#xff0c;以下简称“AS”&#xff09;是BSV网络的重要组件。它是一个复杂的系统&#xff0c;主要职能是在BSV区块链网络内发布信息。这些信息通常与网络访问规则NAR相…