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

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;
}

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 质量管理理论(至简)
  • Latex或者word里面mathtype类型的数学公式如何变成mathematica里面的形式
  • 学习笔记--算法(双指针)7
  • 控制反转(IOC)VS 依赖注入(DI)
  • Go 语言常量 6
  • 反射---Java
  • 达梦数据库的系统视图v$sql_stat
  • Element-UI自学实践
  • 【数据库】MySql深度分页SQL查询优化
  • 前端JS总结(下)之DOM
  • LVS原理——详细介绍
  • dos 常用命令整理
  • 微信小程序的广告变现收益怎么样?
  • 如何高效记录并整理编程学习笔记—笔记工具选择?
  • Windows Server 使用Docke部署挂载问题(安装后无限重启崩溃迁移镜像到D盘打包镜像)
  • ComponentOne 2017 V2版本正式发布
  • JDK 6和JDK 7中的substring()方法
  • JSONP原理
  • Mybatis初体验
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • QQ浏览器x5内核的兼容性问题
  • Spring Boot MyBatis配置多种数据库
  • Zepto.js源码学习之二
  • 闭包,sync使用细节
  • 从重复到重用
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 将 Measurements 和 Units 应用到物理学
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊聊redis的数据结构的应用
  • 目录与文件属性:编写ls
  • 实现简单的正则表达式引擎
  • 微服务入门【系列视频课程】
  • 小程序开发之路(一)
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 阿里云ACE认证之理解CDN技术
  • ​configparser --- 配置文件解析器​
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (libusb) usb口自动刷新
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (二)c52学习之旅-简单了解单片机
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (五)MySQL的备份及恢复
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Linq学习笔记
  • (转)母版页和相对路径
  • (转载)hibernate缓存
  • .NET CORE Aws S3 使用
  • .Net 知识杂记
  • .NET 直连SAP HANA数据库
  • .NET/C# 获取一个正在运行的进程的命令行参数