C++实现单例模式/工厂模式

devtools/2024/9/18 12:41:21/ 标签: c++, 单例模式, 简单工厂模式

单例模式

单例模式即一个类只创建一个实例,提供一个全局访问点。单例模式主要是为了控制资源访问,在一些功能如:数据库连接池,日志类实例,线程池等都可以采用单例模式

// 实现一个单例
#include<iostream>
#include<mutex>
#include<memory>using namespace std;class Singleton{
private:Singleton(){cout<<"Singleton instance create"<<endl;}static mutex mtx;static unique_ptr<Singleton> _instance;Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
public:static Singleton* getInstance() {if (_instance == nullptr) {lock_guard<mutex> lock(mtx);if (_instance == nullptr) {_instance.reset(new Singleton);}}return _instance.get();}
};mutex Singleton::mtx;
unique_ptr<Singleton> Singleton::_instance = nullptr;int main() {Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();cout<<"s1:"<<s1<<endl;cout<<"s2:"<<s2<<endl;return 0;
}				

运行结果:
在这里插入图片描述

工厂模式

工厂模式在即使用一个管理类统一地创建一群被管理类,这些被管理类应该有继承的关系。工厂模式主要的作用为解耦对象的创建和使用。打个比方,英雄联盟里每个英雄都有QWER4个技能,那么可以采用工厂模式管理所有的英雄,当要创建新英雄时,只需要在产品类的子类中添加新英雄并实现QWER四个方法,在工厂类中添加新英雄,就可以提供给用户使用了。

// 实现一个工厂模式
#include<iostream>using namespace std;class ProductBase{
public:virtual void use() = 0;  virtual ~ProductBase(){}
};class Product1 : public ProductBase{
public:void use() override {cout<<"product1 use"<<endl;   }
};class Product2 : public ProductBase{
public:void use() override {cout<<"product2 use"<<endl;   }
};class Factory{
public:ProductBase* createProduct(int type) {switch (type) {case 1:return new Product1();break;case 2:return new Product2();break;default:cout<<"没这个产品"<<endl;break;}return nullptr;}
};int main() {Factory fa;ProductBase* p1 = fa.createProduct(1);p1->use();delete p1;ProductBase* p2 = fa.createProduct(2);p2->use();delete p2;return 0;
}

结果:
在这里插入图片描述


http://www.ppmy.cn/devtools/93677.html

相关文章

graphpad prism 三因素重复测定报错

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

[C++][opencv]基于opencv实现photoshop算法灰度化图像

测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 BlackWhite.hpp #ifndef OPENCV2_PS_BLACKWHITE_HPP_ #define OPENCV2_PS_BLACKWHITE_HPP_#include "opencv2/core.hpp"namespace cv {class BlackWhite { public:float red; //红色的灰度系…

计算机毕业设计Hadoop+Hive居民用电量分析 居民用电量可视化 电量爬虫 机器学习 深度学习 大数据毕业设计 Spark

《Hadoop居民用电量分析》开题报告 一、研究背景与意义 能源问题在全球范围内一直是热点议题&#xff0c;尤其是随着居民生活水平的提高和城市化进程的加快&#xff0c;居民用电量急剧增长&#xff0c;对电力系统的稳定运行和能源管理提出了更高要求。如何科学合理地管理和分…

删除一个git项目的所有提交历史

1. 切换到仓库的根目录&#xff1a; 确保你处于要操作的 Git 仓库的根目录。 2. 删除所有本地分支的历史记录&#xff1a; 首先&#xff0c;切换到一个临时分支&#xff0c;以避免在 master 分支上直接操作&#xff1a; git checkout --orphan temp-branch 3. 添加所有文件…

贷奇乐漏洞学习 --- 两个变态WAF绕过

代码分析 第一个WAF 代码 function dowith_sql($str) {$check preg_match(/select|insert|update|delete|\|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/is, $str);if ($check) {echo "非法字符!";exit();}return $str;} 实现原理 这段PHP代码定义了一个…

怎么在网站底部添加站点地图?

在优化网站 SEO 时&#xff0c;站点地图&#xff08;Sitemap&#xff09;是一个非常重要的工具。它帮助搜索引擎更好地理解和抓取您的网站内容。幸运的是&#xff0c;从 WordPress 5.5 开始&#xff0c;WordPress 自带了站点地图生成功能&#xff0c;无需额外插件。下面将介绍如…

iOS Swift开发 navigation模式自定义pop和push动画

在基于navigation的跳转涉及到pop和push操作&#xff0c;这个时候&#xff0c;如果想要自定义画面切入的动画可以按如下操作 添加如下类&#xff1a; import UIKitclass SimpleOver: NSObject, UIViewControllerAnimatedTransitioning {var popStyle: Bool falsefunc transi…

【RN】实现markdown文本简单解析

需求 支持文本插入&#xff0c;比如 xxx {product_name} xxx &#xff0c;如果提供了product_name变量的值为feedback&#xff0c;则可以渲染出 xxx feedback xxx。支持链接解析&#xff0c;比如 [baidu](https://www.baidu.com/)&#xff0c;可以直接渲染成超链接的形式。支持…

数据库(二):DDL

数据库&#xff08;二&#xff09;&#xff1a;DDL 一、数据库操作&#xff08;一&#xff09;查询&#xff08;二&#xff09;创建&#xff08;三&#xff09;使用(切换数据库&#xff09;&#xff08;四&#xff09;删除 二、表&#xff08;图形化工具&#xff09;&#xff0…

使用ThreadStatic属性提供线程安全的数据访问

ThreadStatic是一个C#属性&#xff0c;用于为每个线程提供独立的静态字段。使用它可以让每个线程拥有该字段的独立副本&#xff0c;避免线程之间的共享 用途 线程独立数据&#xff1a;每个线程有独立的数据副本&#xff0c;彼此不干扰性能优化&#xff1a;在多线程环境中减少…

银行卡OCR识别接口如何用Java进行调用

一、什么是银行卡OCR识别接口&#xff1f; 银行卡OCR识别接口&#xff0c;它可以实时对银行卡卡面的文字信息进行识别&#xff0c;包括银行卡号、银行名称、卡类型、有效期等要素&#xff0c;从而提高信息录入效率&#xff0c;改善用户体验。 二、银行卡OCR识别接口适用场景有…

git做版本管理的时候,中途添加了新的内容在.gitignore中,怎么让git不再跟踪

当您在 .gitignore 文件中添加了新的路径模式后&#xff0c;Git 将不再跟踪这些路径下的新文件。但是&#xff0c;如果这些路径下的文件已经被 Git 跟踪&#xff08;即它们已经被提交到仓库&#xff09;&#xff0c;您需要执行一些额外的步骤来让 Git 停止跟踪这些文件。 以下…

【MySQL数据库】单机、集群、分布式的区别

单机、集群和分布式是计算机系统中三种不同的架构模型,它们在资源管理、任务执行和性能优化方面有显著区别。 图片来源 1. 单机(Standalone) 单机指的是单一计算机系统,即所有的计算任务和数据都在一台计算机上处理。单机系统的特点包括: 硬件限制:受限于单台机器的计…

以树莓集团的视角:探索AI技术如何重塑数字媒体产业发展

在科技日新月异的今天&#xff0c;AI技术如同一股不可阻挡的潮流&#xff0c;正深刻改变着我们的世界&#xff0c;尤其是数字媒体产业发展。作为数字产业生态链的杰出建设者&#xff0c;树莓集团始终站在时代前沿&#xff0c;积极探索AI技术如何为数字媒体产业注入新活力。 在树…

【CSS】可替换元素的控制属性:object-fit属性和object-position属性

一、可替换元素是什么&#xff1f; 可替换元素指的是其展现的效果和内容是不受到css控制的&#xff0c;而是由外部资源来决定的。 典型的可替换元素有<iframe>、<img>、<video>、<embed>&#xff0c;有些情况下canvas、audio、object、option、以及ty…

H5 优化手段

容器预建 提前创建 Webview 容器 创建时机&#xff1a;闲时创建。Webview 只能在主线程创建&#xff0c;但又不能阻碍主流程&#xff0c;因此需要在 IdleHandler 时机处理。与前端的 requestIdleCallback 、React Scheduler 概念相似。创建个数&#xff1a;一般仅创建一个&…

黑盒测试定义:优势、类型和工具

了解黑盒测试的本质&#xff0c;无需深入了解代码内部即可测试功能。 在不了解软件代码结构或实现细节的情况下进行系统测试是软件测试生命周期的重要组成部分。与需要深入了解内部结构和逻辑的白盒测试不同&#xff0c;黑盒测试允许工程师在不了解软件内部工作原理的情况下评估…

uni-app 安卓禁用侧滑返回/虚拟返回(vue3 hook)

[TOC](uni-app 安卓禁用侧滑返回/虚拟返回(vue3 hook)) hook import { onBackPress } from "dcloudio/uni-app"export default function useDisableSwipeBack() {onBackPress((options) > {// 点击虚拟键或者侧滑的时候触发&#xff08;不允许返回&#xff09;i…

什么是流批一体?怎样理解流批一体?

目录 一、流式处理与批量处理概述 1.流式处理 2.批量处理 3.流批一体的定义 二、流批一体的关键特点 三、流批一体的技术实现 四、应用场景 五、实施流批一体的考虑因素 流批一体听起来很简单&#xff0c;但内涵却十分复杂。它包含了计算语义、编程模型、API、调度、执行、shuf…

MySQL是一个开源的关系型数据库管理系统

MySQL是一个开源的关系型数据库管理系统&#xff0c;广泛用于构建各种规模的数据库应用程序。它是一种轻量级且高性能的数据库解决方案&#xff0c;能够处理大规模的数据&#xff0c;并提供了高度可靠的数据存储和访问。 MySQL支持多种操作系统平台&#xff0c;包括Windows、L…