常用的设计模式(单例模式和工厂模式)

设计模式

单例模式

    1. 私有构造函数,防止外部直接实例化
    2. 静态成员函数,返回唯一实例的引用
    3. 静态局部变量,在程序生命周期内
#include<iostream>
#include<map>
using namespace std;class shoppingCartManager {
public:// 获取购物车实例// 2. 静态成员函数, 返回唯一实例的引用static shoppingCartManager& getInstance(){static shoppingCartManager instance;// 3. 静态局部变量,在程序生命周期内只被创建一次,因此,每次调用getInstance,都返回相同的实例return instance;}void addToChart(const string& itemName, int quantity) {cart[itemName] += quantity;}void viewCart() const {for (const auto& item : cart) {cout << item.first << "" << item.second << endl;}}private:// 1, 私有构造函数,防止外部直接实例化shoppingCartManager() {}map<string, int>cart;
};int main() {string itemName;int quantity;shoppingCartManager& ca = shoppingCartManager::getInstance();ca.addToChart("aaa", 3);while (cin >> itemName >> quantity) {if (itemName == "end") break;shoppingCartManager& cart = shoppingCartManager::getInstance();cart.addToChart(itemName, quantity);}const shoppingCartManager& cart = shoppingCartManager::getInstance();cart.viewCart();return 0;
}

工厂模式

  • 对类内部数据的只读访问

    const vector<Block*> & getBlocks() const{return blocks;
    }
    
  • 创建型设计模式,引入抽象类和具体类

  • 一个工厂方法可以创建一个具体产品

#include <iostream>
#include <vector>using namespace std;// 抽象积木接口
class Block {
public:virtual void produce() = 0;
};// 具体圆形积木实现
class CircleBlock :public Block {
public:void produce() override {cout << "Circle Block." << endl;}
};// 具体方形积木实现
class SquareBlock : public Block {
public:void produce() override {cout << "Square Block." << endl;}
};// 抽象积木工厂接口
class BlockFactory {
public:virtual Block* createBlock() = 0;
};// 具体圆形积木实现
class CircleFactory : public BlockFactory {
public:Block* createBlock() override {return new CircleBlock();}
};// 具体方形积木实现
class SquareFactory : public BlockFactory {
public:Block* createBlock() override {return new SquareBlock();}
};// 积木工厂系统
class BlockFactorySystem {
private:vector<Block*> blocks;
public:void produceBlocks(BlockFactory* factory, int quantity) {for (int i = 0; i < quantity; i++) {Block* block = factory->createBlock();blocks.push_back(block);block->produce();}}// 对类内部数据的只读访问const vector<Block*>& getBlocks() const {return blocks;}~BlockFactorySystem() {for (Block* block : blocks) {delete block;}}
};int main() {BlockFactorySystem factorySystem;int productionCount;cin >> productionCount;for (int i = 0; i < productionCount; i++) {string blockType;int quantity;cin >> blockType >> quantity;if (blockType == "Circle") {factorySystem.produceBlocks(new CircleFactory(), quantity);}else {factorySystem.produceBlocks(new SquareFactory(), quantity);}}const vector<Block*>& blocks = factorySystem.getBlocks();for (auto& block : blocks) {block->produce();}return 0;
}

抽象工厂模式

  • 一个工厂方法可以创建一类具体产品
  • 应用场景:使用抽象工厂模式来创建不同数据库的连接对象
#include <iostream>
#include <string>using namespace std;// 抽象椅子类
class Chair {
public:virtual void showInfo() = 0;
};class ModernChair : public Chair {
public:void showInfo()override {cout << "modern chair" << endl;}
};class ClassicalChair : public Chair {void showInfo() override {cout << "classical chair" << endl;}
};class Sofa {
public:virtual void displayInfo() = 0;
};class ModernSofa : public Sofa {
public:void displayInfo() override{cout << "display sofa" << endl;}
};class ClassicalSofa : public Sofa {
public:void displayInfo() override {cout << "classical sofa" << endl;}
};// 抽象家具工厂接口
class furnitureFactory {
public:virtual Chair* createChair() = 0;virtual Sofa* createSofa() = 0;
};// 现代家具工厂接口
class ModernFurnitureFactory : public furnitureFactory {
public:Chair* createChair() override {return new ModernChair();}Sofa* createSofa() override {return new ModernSofa();}
};// 传统家具工厂接口
class ClassicalFunitureFactory : public furnitureFactory {
public:Chair* createChair() override {return new ClassicalChair();}Sofa* createSofa() override {return new ClassicalSofa();}
};int main() {int N;cin >> N;for (int i = 0; i < N; i++) {string furnitureType;cin >> furnitureType;furnitureFactory* factory = nullptr;if (furnitureType == "Modern") {factory = new ModernFurnitureFactory();}else if (furnitureType == "Classical") {factory = new ClassicalFunitureFactory();}Chair* chair = factory->createChair();Sofa* sofa = factory->createSofa();chair->showInfo();sofa->displayInfo();delete chair;delete sofa;delete factory;}return 0;
}

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

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

相关文章

Scala第十六章节(泛型方法, 类, 特质的用法、泛型上下界、协变, 逆变, 非变的用法以及Scala列表去重排序案例)

Scala第十六章节 章节目标 掌握泛型方法, 类, 特质的用法了解泛型上下界相关内容了解协变, 逆变, 非变的用法掌握列表去重排序案例 1. 泛型 泛型的意思是泛指某种具体的数据类型, 在Scala中, 泛型用[数据类型]表示. 在实际开发中, 泛型一般是结合数组或者集合来使用的, 除此…

C# 中 == 和 Equals 的区别

在C#中&#xff0c; 和 Equals 都是用于比较两个对象是否相等的操作符或方法&#xff0c;但它们之间存在着显著的区别。这些区别主要体现在它们的操作级别、用途以及如何处理不同类型的对象比较上。 1. 操作级别和用途 操作符&#xff1a; 是一个操作符&#xff0c;用于比较…

vulhub中Apache solr XML 实体注入漏洞复现(CVE-2017-12629)

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞&#xff1a;XML…

Day13Day14_学点儿HTML_基本标签、div和span、table、form

1 基本标签 HTML&#xff1a;超文本标记语言 定义页面结构 CSS&#xff1a; 层叠样式表 页面显示的样式、排版 BootStrap JS&#xff1a; JavaScript 界面交互(动态交互、逻辑) JQuery <!--~ 适度编码益脑&#xff0c;沉迷编码伤身&#xff0c;合理安排时…

SBCFormer:能够在单板计算机上以每秒1帧的速度进行全尺寸ImageNet分类的轻量级网络

摘要 https://arxiv.org/ftp/arxiv/papers/2311/2311.03747.pdf 计算机视觉在解决包括智能农业、渔业和畜牧业管理等不同领域的实际问题中变得越来越普遍。这些应用可能不需要每秒处理许多图像帧&#xff0c;因此从业者倾向于使用单板计算机&#xff08;SBCs&#xff09;。尽管…

基于SpringBoot的“校园志愿者管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园志愿者管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面图 志愿者注册…

数据可视化高级技术(Echarts)

目录 &#xff08;一&#xff09;数据可视化概念及Echarts基础知识 数据可视化的好处&#xff1a; 数据可视化的目标 数据可视化的基本流程 &#xff08;二&#xff09;数据图表 类别比较图表&#xff1a; 数据关系图表&#xff1a; 数据分布图表&#xff1a; 时间序列…

Excel 隔几行批量插入空白行

例如如下表格&#xff0c;每隔6行插入一行数据&#xff1a; 1&#xff09;第7个单元格输入1 2&#xff09;选中6个单元格&#xff0c;然后双击填充数据&#xff1a; 3&#xff09;F5 找到常量 Ctrlshift 复制插入的数据&#xff0c;然后选中数据 按F5&#xff0c;定位到空值

【Web】记录Polar靶场<中等>难度题一遍过(全)

目录 到底给不给flag呢 写shell 注入 某函数的复仇 xxe SSTI unpickle BlackMagic 反序列化 找找shell 再来ping一波啊 wu 代码审计1 你的马呢&#xff1f; ezphp 随机值 phpurl search file PlayGame csdn 反正持续一个月&#xff0c;感觉XYCTF…

leetcode414-Third Maximum Number

这道题目求第三大数&#xff0c;如果第三大数不存在则返回最大数&#xff0c;且该数字最大值不超过2^31-1。从这个提示上就可以看出这个数字是用int类型表示的。我们当然可以通过排序的方式先给数组排序然后很容易的就能求解。但是有没有什么更好的办法呢&#xff1f;对于数组来…

「PHP系列」数组详解

文章目录 一、PHP数组1. 数组的基本语法使用 array() 函数创建数组使用短数组语法创建数组 2. 访问数组元素3. 遍历数组4. 数组函数5. 多维数组6. 注意事项 二、常见问题1. 如何检查数组是否为空&#xff1f;2. 如何合并两个数组&#xff1f;3. 如何获取数组中的最后一个元素&a…

c#中DocFx生成API帮助文档

安装docfx dotnet tool update -g docfx加载环境变量 export PATH"$PATH:/Users/xx/.dotnet/tools"初始化文档目录 docfx init修改配置docfx.json,src指向源码目录 "metadata": [{"src": [{"src": "../xx/","files…

FPGA高端项目:解码索尼IMX327 MIPI相机+图像缩放+HDMI输出,提供开发板+工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理自研HLS图像缩放详解图像缓存HDMI输出工程…

【产品经理】全面解读“数字孪生”

理解数字孪生 随着互联网技术的深入发展&#xff0c;数字孪生被越来越多地提及&#xff0c;那么数字孪生到底是什么&#xff1f;数字孪生&#xff0c;翻译自英文“Digital Twin”&#xff0c;最早在2002年&#xff0c;被从事产品生命周期管理PLM的Michael Grieves教授&#xf…

探究云手机的海外原生IP优势

随着全球数字化进程的加速&#xff0c;企业越来越依赖于网络来扩展其业务。在这个数字时代&#xff0c;云手机作为一种创新的通信技术&#xff0c;已经成为了企业网络优化的重要组成部分。云手机支持海外原生IP的特性&#xff0c;为企业在国际市场上的拓展提供了全新的可能性。…

大数据系列 | Kafka架构分析及应用

大数据系列 | Kafka架构分析及应用 1. Kafka原理分析2. Kafka架构分析3. Kafka的应用3.1. 安装Zookeeper集群3.2. 安装Kafka集群3.3. 生产者和消费者使用3.3.1. 生产者使用3.3.1. 消费者使用 4. Kafka Controller控制器 1. Kafka原理分析 Kafka是一个高吞吐量、 持久性的分布式…

P1914 小书童——凯撒密码,学会字符串的拆分

小书童——凯撒密码 - 洛谷 import java.util.*;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);int nsc.nextInt();String numsc.next();for(int i0;i<num.length();i) {char nunum.charAt(i);nu(char)((nu-an)%26a);Syst…

电商运营自动化新里程:取数宝引领数字化转型实践

随着电子商务行业的高速发展及复杂化&#xff0c;精细化运营已成为电商企业提升竞争力的关键所在。尤其是在海量数据处理与实时分析方面&#xff0c;自动化工具的引入对企业管理和决策带来了革命性变化。其中&#xff0c;“取数宝”作为一种先进的电商运营自动化解决方案&#…

dockerfile制作-pytoch+深度学习环境版

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 文档内容docker相关术语docker常用命令容器常用命令根据dockerfile创建容器dokerfile文件内容 docker问题&#xff1a;可能的原因和解决方法示例修改修改后的D…

解析Apache Kafka:在大数据体系中的基本概念和核心组件

关联阅读博客文章&#xff1a;探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章&#xff1a;深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章&#xff1a;深度剖析&#xff1a;计算机集群在大数据体系中的关键角色和技术要点 关联阅读博客文章&a…