蒲县网站建设长沙中小企业做网站

news/2025/10/6 20:51:55/文章来源:
蒲县网站建设,长沙中小企业做网站,wordpress名站,桂林市国龙外国语学校1.简介 1.1单例模式 C单例模式被广泛应用于需要全局唯一实例的场景。以下是一些常见的使用场景#xff1a; 日志记录器 在大多数应用程序中#xff0c;需要一个全局的日志记录器来记录系统运行时的事件和错误。使用单例模式可以确保只有一个日志记录器实例#xff0c;并能…1.简介 1.1单例模式 C单例模式被广泛应用于需要全局唯一实例的场景。以下是一些常见的使用场景 日志记录器 在大多数应用程序中需要一个全局的日志记录器来记录系统运行时的事件和错误。使用单例模式可以确保只有一个日志记录器实例并能够在整个应用程序中共享和访问。 数据库连接池 数据库连接是有限且昂贵的资源为了避免频繁地创建和销毁连接可以使用单例模式来管理数据库连接池。这样可以确保在应用程序中只有一个连接池实例并且可以在需要时轻松获取数据库连接。 配置管理器 配置管理器负责加载和管理应用程序的配置信息例如数据库连接字符串、日志级别等。通过单例模式可以确保只有一个配置管理器实例并能够在整个应用程序中统一访问配置信息。 全局对象管理器 在某些应用程序中可能存在需要全局访问的对象例如全局事件管理器、全局资源管理器等。使用单例模式可以确保这些全局对象只有一个实例并能够在整个应用程序中方便地进行访问和使用。 线程池 线程池用于管理和调度多个线程执行任务通过单例模式可以确保只有一个线程池实例并能够在整个应用程序中灵活地进行任务分发和执行。 这些只是一些常见的使用场景实际上单例模式可以适用于任何需要一个全局唯一实例的情况。但是需要注意的是单例模式可能会带来全局共享状态的问题因此在使用单例模式时需要仔细考虑其潜在的风险和副作用。同时还要记住在多线程环境中使用单例模式需要考虑线程安全性。 1.2 原型模式 原型模式是一种通过复制现有对象来创建新对象的设计模式。它使用一个原型对象作为创建对象的样板通过克隆原型对象来生成新的对象而不是使用传统的实例化过程。       原型模式的核心思想是使用已有对象作为原型通过复制克隆这个原型来创建新的对象而不是通过传统的实例化方式。这种方式允许我们在运行时动态地创建对象并且可以避免耗费时间和资源去重新初始化对象。 1.3 比喻-手机原型机和量产机 原型模式和单例模式可以这样比喻我们要制作一款手机 原型模式比喻为手机的制作过程中我们先制作一个原型机并通过复制原型机来制造更多的手机。原型机是一个已经设计好的模板我们可以根据它来制造新的手机而每个手机都可以独立使用和修改。这样我们可以根据原型机的特性和功能来扩展和修改手机从而得到多个不同的手机实例。 单例模式比喻为手机的制造过程中我们只允许制造一台手机这台手机成为该品牌的唯一代表。无论是在什么地方我们都只能获得并使用这一台手机。这样做的好处是我们可以保证这台手机的唯一性避免资源浪费并且方便全局访问。 2.单例的简单实现 class SysParaData : { public:static SysParaData instance(){static SysParaData self;return self;}private:SysParaData();~SysParaData();SysParaData(const SysParaData self);const SysParaData operator(const SysParaData self); }; 这里用单例模式定义了一个全局只有一个的数据参数类用来存储全局的参数。 在类中instance()是一个公共的静态成员函数用于返回SysParaData类的唯一实例。这个函数通过局部静态变量self来实现在第一次调用instance()函数时创建实例。由于局部静态变量在函数退出后仍然存在所以每次调用instance()函数都会返回同一个实例。 同时构造函数、析构函数、拷贝构造函数和赋值运算符被声明为私有这意味着不能从类的外部直接实例化、销毁、复制或赋值SysParaData对象。这样可以确保只有instance()函数可以创建和访问SysParaData类的唯一实例。 单例模式的优点之一是可以提供全局唯一的对象访问点方便在程序中的任何地方使用该对象。通过调用SysParaData::instance()函数可以获得对SysParaData类的唯一实例的引用。 注意这里没有进行多线程安全的处理。如果在多线程环境中使用该单例模式可能需要额外的线程同步措施以确保线程安全。例如使用互斥锁或其他线程同步机制来保护实例的创建和访问过程。 3.原型模式的简单实现 // 原型类 class SysParaModifyDataBase { public:virtual SysParaModifyDataBase *Clone() 0; };// class SysParaModifyData: public SysParaModifyDataBase { public:SysParaModifyData()virtual Prototype *Clone(){return new SysParaModifyData(*this);}int data 1; };SysParaModifyDataBase *dataSource new SysParaModifyData(); SysParaModifyDataBase *dataModify dataSource -Clone(); 4.原型模式和单例模式的结合 class SysParaData { private:static SysParaData *instance; public:/* 禁止拷贝构造函数 禁止拷贝赋值运算符的另一种写法 与上面单例代码设为私有效果一样 */SysParaData (const SysParaData ) delete;SysParaData operator(const SysParaData ) delete;/* 单例实例的另一种写法 */static SysParaData *getInstance() {if (instance nullptr) {instance new SysParaData ();}return instance;}void setName(const std::string newName) {name newName;}std::string getName() const {return name;}SysParaData *clone() const {SysParaData *cloneInstance new SysParaData ();cloneInstance-setName(this-name);return cloneInstance;} }; 如果使用clone()方法克隆一个SysParaData对象并使用该克隆对象调用setName()修改名称那么原始的单例对象将不受影响它们是相互独立的。因此克隆对象和原始单例对象不再是同一个单例。 单例模式的规则是一个类只能有一个实例并且通过getInstance()方法获取单例实例。在这个例子中我们使用静态变量instance来存储唯一的单例实例而且通过禁止拷贝构造函数和拷贝赋值运算符的使用来确保只有一个实例。克隆方法clone()是为了使用已有的单例对象来创建新的对象实例。 被克隆之后的对象如果不使用clone()方法创建而是直接使用单例对象的指针进行赋值或传递那么它们仍然是指向同一个单例的指针。 例如 SysParaData *singleton SysParaData::getInstance(); SysParaData *cloneInstance singleton-clone(); // 克隆单例对象SysParaData *directAssignment singleton; // 直接赋值 SysParaData *functionParameter cloneInstance; // 作为函数参数传递// 修改单例对象的名称 singleton-setName(Singleton);// 输出对象的名称 std::cout Singleton Name: singleton-getName() std::endl; std::cout Direct Assignment Name: directAssignment-getName() std::endl; std::cout Function Parameter Name: functionParameter-getName() std::endl;输出结果将会是 Singleton Name: Singleton Direct Assignment Name: Singleton Function Parameter Name: Cloned Instance可以看到直接赋值或作为函数参数传递的对象指针仍然指向同一个单例对象因此它们的名称相同。只有通过clone()方法创建的对象是一个独立的克隆实例它们和原始单例对象是不同的。 因此被克隆之后的对象如果不使用clone()方法创建而是直接使用单例对象的指针进行赋值或传递仍然是指向同一个单例实例因此仍然是单例。 5.总结 当原型模式与单例模式结合在一起时可以实现一个可以克隆的单例。 在传统的单例模式中类只能有唯一的一个实例并且使用静态方法获取该实例。而在原型模式中可以通过复制原型对象来创建新的对象实例。 当将这两种模式结合在一起时通过克隆原型对象可以创建多个具有相同属性和行为的实例同时保持单例的特性即每次克隆都得到同一个实例。 这种结合模式的应用场景是当希望在单例基础上创建新的对象实例这些新实例保持与原始实例相同的初始状态并且这些实例之间相互独立。 使用这种结合模式可以方便地创建多个独立且具有相同初始状态的对象同时避免了在使用时传递参数的麻烦。它提供了更大的灵活性和可扩展性同时仍然保持了单例的特性。 注意此结合模式的实现需要对原型对象进行深度拷贝以确保每个克隆对象是独立的。否则如果使用浅拷贝所有克隆对象将共享同一个状态这不符合原型模式的预期。

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

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

相关文章

16_AiAgentMCP简单教程

ai mcp AI Agent与MCP简单教程:从入门到实践 总起:开启AI Agent与MCP之旅 什么是AI Agent? AI Agent(人工智能代理)是能够自主感知环境、做出决策并执行行动的智能实体。与传统的被动式AI不同,AI Agent具有主动性…

17_AiAgentMCP实现技术选型

ai mcp AI Agent与MCP实现技术选型:全面指南与最佳实践 总起:技术选型的重要性与挑战 为什么MCP技术选型至关重要? 在AI Agent快速发展的时代,Model Context Protocol(MCP)作为连接AI模型与外部资源的关键桥梁,…

谷歌chrome浏览器优化网络搜索引擎

def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键,保持顺序ordered_keys []# 遍历data中的每个字典,添加其键到ordered_keys,如果该键还未被添加for d in original_list:for …

JVM_XMS 和 java_opts哪种写法对?如何在JVM中设置JVM_XMS和java_opts?

JVM_XMS 和 java_opts哪种写法对? JVM_XMS与JAVA_OPTS是两种不同的JVM参数设置方式,具体写法需根据使用场景选择: JVM_XMS(初始堆大小)‌写法‌::ml-search-more[-Xms]{text="-Xms"}(如-Xms512m) ‌…

百度网盘做存储网站上海百度搜索优化

我一直在探索PPT中平滑切换的应用。这篇文章感觉算是探索到头了。之前的文章中,曾经提到过平滑切换可以让3D模型动起来。但是在实际应用中,能够供PPT使用的3D素材数量有限,难以准确契合我们的需求。后来我发现,只需要1张普通图片&…

鸿蒙编译ffmpeg库 - 详解

鸿蒙编译ffmpeg库 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

网站描述怎么设置网站上线后的工作

解决方法就是: from django.urls import reverse 最近从django1.9迁移到django2.0中出现一个意外的报错: 这个报错的原因在stack overflow上有很直接的解释,但是百度上并没有直接的答案。 简单来说,原因就是:django2.0 把原来…

宁乡县住房和城乡建设局网站扒网站样式

来源:《科学哲学的历史导论》、思庐哲学(siluphilosophy)作者:约翰洛西对正统学说的诸多批评有一种累积的效果。许多科学哲学家渐渐认为,用形式逻辑范畴来重建科学时会失去一些至关重要的东西。在他们看来,…

知道却做不到

这种“知道步骤但写不出来”的情况非常常见,核心原因是对“类的参数设计”和“类之间的协作关系”还没有形成清晰的逻辑链。其实参数设计有明确的规律——每个类的参数都应该服务于它的“核心职责”。我们用“从职责倒…

题解:loj154 集合划分计数

题意:给出一个大小为 \(n\) 的全集 \(A = \{1,2,\cdots n\}\),再给出 \(m\) 个集 \(S_1,S_2\cdots S_m\),要求从这些集里选出至多 \(k\) 个,满足 \(S\) 间没有交集且并集是全集,\(k\le n\le 21,m\le 262144\)。 做…

网址大全下载app鄂州网站seo

目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击(PTH攻击) 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录,可以使用这个工具 ​ 第一种连接方式:smbclient -L 目…

怎样做网贷网站陕西省建设银行网站

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字,它们除了长得像之外,其他的(作用和含义)完全不同。 它们三个的区别就好像:雷、雷锋、雷峰塔之间的区别。(是三个完全不同的东西&#…

博客网站主页代码html介绍在家里做的点心的网站

经过一些自己的混淆,最终博客方法的具体含义(最终声明的方法参数)将对此博客条目进行澄清。 至少可以将方法参数上的final关键字视为Java编译器的指示符,表明该参数不能重新分配给另一个引用。 Java参数处理始终是“按值调用” &a…

电商网站建设培训wordpress的用法

文章目录 问题引入 1:问题阐述 2:问题分析 一:从SpringBoot的自动装配 1:SpringBootApplication介绍 2:自动装配的核心方法 3:核心方法的调用路径 4:SpringSecurity核心配置 5&#xf…

详细介绍:003 flutter初始文件讲解(2)

详细介绍:003 flutter初始文件讲解(2)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

为什么 Java 中打印Object类型的变量无需强转,而从Object类型的数组中取元素却要强转?

两个奇怪的现象 case1:打印Object对象时,无需强转: Object val = 25; System.out.println(val); // 直接打印,输出:25 // 不需要:(String)val 或 (Integer)valcase2:当我们要使用Object 数组中的元素时,需要强…

商城网站源代码html5网站模板 免费

定义 考手刹的专业称呼是辅助制动器,与制动器的原理不同,其是采用钢丝拉线连接到后制动蹄上,以对车子进行制动。作用 用于平地斜坡停车时制动,防止车子在无人状态下自动滑跑,逼免发生交通事故。工作原理 其原…

定制开发开源AI智能名片S2B2C商城小程序在无界零售中的应用与行业智能升级示范研究 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站建设样板四平网站建设联系方式

1,背景: 在本地java开发完毕之后,想要打包成docker镜像,方便安装。由于本地没有docker环境,也懒得装了。有一台测试的linux机器可以使用,所以先在本地打包生成xxx.jar,然后拷贝到有docker环境的…

网站主页 优帮云做乡村旅游的网站

<Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成&#xff0c;并可以在等待时渲染一个加载状态。 异步依赖​ 要了解 <Suspense> 所解决的问题和它是如何与异步依赖进行交…