C++中的23种设计模式精讲

目录

  • 1 单例模式
  • 2 工厂方法模式
  • 3 抽象工厂模式
  • 4
  • 参考

1 单例模式

题目链接为:小明的购物车

C++代码如下,

#include <iostream>
#include <string>
#include <vector>using namespace std;class ShoppingCart {
public:static ShoppingCart& get_instance() {static ShoppingCart instance = ShoppingCart(); //静态变量,类的所有对象共用一个return instance;}vector<string>& get_goods() { return goods;}vector<int>& get_cnt() {return cnt;}void show() {int n = goods.size();for (int i = 0; i < n; ++i) {cout << goods[i] << " " << cnt[i] << endl;}return;}private:ShoppingCart () {} //构造函数私有化,防止外部直接实例化类的对象vector<string> goods; vector<int> cnt; 
};int main() {ShoppingCart& shopping_cart = ShoppingCart::get_instance();string a;int b;while (cin >> a >> b) {shopping_cart.get_goods().emplace_back(a);shopping_cart.get_cnt().emplace_back(b);}shopping_cart.show();return 0;
}

注意要点:

  1. 构造函数私有化,防止外部直接实例化ShoppingCart类的对象。
  2. 静态变量instance,只会被创建一次,故ShoppingCart类的所有对象共用一个instance。又因为变量instance的类型为ShoppingCart,故该类只会存在一个实例化对象。

2 工厂方法模式

题目链接:积木工厂

C++代码如下,

#include <iostream>
#include <vector>using namespace std;class Block {
public:virtual void produce() = 0;
};class CircleBlock : public Block {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 CircleBlockFactory : public BlockFactory {
public:Block* createBlock() override {return new CircleBlock();}
};class SquareBlockFactory : 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.emplace_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 CircleBlockFactory(), quantity);} else if (blockType == "Square") {factorySystem.produceBlocks(new SquareBlockFactory(), quantity);}}return 0;
}

3 抽象工厂模式

题目链接:家具工厂

C++代码如下,

#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 {
public:void showInfo() override {cout << "classical chair" << endl;}
};class Sofa {
public:virtual void displayInfo() = 0;
};class ModernSofa : public Sofa {
public:void displayInfo() override {cout << "modern 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 ClassicalFurnitureFactory : 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 ClassicalFurnitureFactory();}Chair* chair = factory->createChair();Sofa* sofa = factory->createSofa();chair->showInfo();sofa->displayInfo();delete chair;delete sofa;delete factory;}return 0;
}

4

参考

卡码网

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

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

相关文章

C语言经典算法之直接排序算法

目录 前言 一、代码实现 二、时空复杂度 时间复杂度&#xff1a; 空间复杂度&#xff1a; 前言 建议&#xff1a;1.学习算法最重要的是理解算法的每一步&#xff0c;而不是记住算法。 2.建议读者学习算法的时候&#xff0c;自己手动一步一步地运行算法。 tips:希尔排序算…

利用反射获取websocket,session字段的值

首先利用反射获取方法字段&#xff0c;然后取得字段的值 private static ConcurrentHashMap<String, Session> map new ConcurrentHashMap<>();OnOpenpublic void onOpen(Session session) throws IllegalAccessException {log.info(session.getId() "开始连…

Flask架构--路由和蓝图

学习视频&#xff1a;第二章&#xff1a;路由和蓝图 1 Flask查询路由的方式_哔哩哔哩_bilibili 参考&#xff1a;Flask框架之路由与蓝图的使用_flask 路由和蓝图-CSDN博客 1.路由的概念&#xff1a; 用于将http请求与特定的python函数相匹配。定义路由后&#xff0c;flask程…

模型索引:QModelIndex

一、为什么要使用模型索引&#xff1f; 从名字可以看出&#xff0c;他是模型的索引&#xff0c;只要对模型实体&#xff08;各种xxxModel的实体&#xff09;施加这个索引&#xff0c;model就会返回数据集中对应的值&#xff0c;或者通过这个索引修改对应数据集中的值。 类比数…

Java内容

目录 1.命名规范 1.命名规范 2.变量

懒得玩游戏--帮我做数独

目录 简介自动解数独思路核心思路输入解析打印 完整代码 简介 最近玩上了一款类似于数独的微信小程序游戏&#xff0c;名字叫数独趣味闯关&#xff0c;过了数独的关卡之后会给拼图&#xff0c;玩了几关之后摸清套路了就有点累了&#xff0c;但是还想集齐拼图&#xff0c;所以就…

【AUTOSAR】--01 AUTOSAR网络管理基础

AUTOSAR网络管理做了几个项目了&#xff0c;但发现还是有些理解不够深入的地方&#xff0c;最近趁着有个新项目也要做AUTOSAR网络管理&#xff0c;再从头梳理一下AUTOSAR网络管理&#xff0c;预计用2-3篇文章&#xff0c;把AUTOSAR网络重新梳理完成。 这是第一篇&#xff0c;主…

C //练习 4-13 编写一个递归版本的reverse(s)函数,以将字符串s倒置。

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-13 练习 4-13 编写一个递归版本的reverse(s)函数&#xff0c;以将字符串s倒置。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要变更。 IDE工具&#xff1a;Visual S…

Element-Puls Form表单内嵌套el-table表格,根据表格复选框多选或单选动态设置行的验证规则

需求 根据 Table 表格内的复选框来控制当前选中行是否添加必填校验规则 效果图 实现思想 我们需要设置一个 flag 来标识已勾选的行&#xff0c;el-table渲染数据结构是数组对象形式&#xff0c;我们可以在每个对象中手动加如一个标识&#xff0c;例如默认&#xff1a;selected …

Windows环境 elasticsearch 及可视化界面 安装

安装 elastic 的官网 elastic.co/downloads/elasticsearch 当你解压好了归档文件之后&#xff0c;Elasticsearch 已经准备好运行了。按照下面的操作&#xff0c;在前台(foregroud)启动 Elasticsearch&#xff1a; cd elasticsearch-<version> ./bin/elasticsearch 如…

大型语言模型综述/总结 LLM A Survey of Large Language Models

A Survey of Large Language Model AbstractINTRODUCTIONOVERVIEW背景LLM的新兴能力LLM的关键技术GPT 系列模型的技术演进 大语言模型资源公开可用的模型检查点或 API常用语料库代码库资源 预训练数据收集架构 论文标题&#xff1a;A Survey of Large Language Model 论文地址&…

详谈Python的开发工具

Python作为一种流行的编程语言&#xff0c;在开发过程中需要使用各种工具来提高效率、简化工作流程和改善开发体验。在本文中&#xff0c;我们将介绍一些常用的Python开发工具&#xff0c;包括文本编辑器、集成开发环境&#xff08;IDE&#xff09;、虚拟环境管理工具、包管理器…

git常用命令集合及其演示

文章目录 一.git常用命令集合及其演示1.git config --list 查看配置信息2.git status 查看当前仓库的状态3.git add . 加到暂存区4.git commit -m "描述信息" 添加到版本库5.git diff xxxx 查看xxxx文件修改了哪些内容&#xff0c;相比于暂存区的区别6.git rm --cach…

PLSQL启动报错:Initialization error,不能初始化

出现场景&#xff1a;我这里原来有个旧版的PLSQL&#xff0c;想用新版的又装了个新版&#xff0c;启动的时候报错 解决办法 1.核对程序位数 第一个提示明显看到是和程序位数相关的&#xff0c;不管是32位还是64位要做到向匹配 2.设置oci.dll 第二个提示可以看到是和oci.dll…

03 Lombok+AOP思想+注解进化SqlSession工具类03

Lombok 实体类中除了定义好的属性外&#xff0c;我们常常还要写set/get构造方法等&#xff0c;用Lombok可以用一条注解帮忙生成。 一个Data会同时包含 Getter/Setter ToString EqualsAndHashCode RequiredArgsConstructor 使用方法&#xff1a;需要同时添加Lombok插件和Lombo…

【云原生】springboot 整合 OpenTelemetry

目录 一、前言 二、应用可观测性概述 2.1 什么是可观测性 2.2 可观测性三大指标 2.2.1 指标&#xff08;Metrics&#xff09; 2.2.2 日志&#xff08;log&#xff09; 2.2.3 追踪(Traces) 三、OpenTelemetry 介绍 3.1 什么是OpenTelemetry 3.2 OpenTelemetry架构和组件…

蓝桥杯省赛无忧 STL 课件17 map

01 map 02 multimap 03 unordered_map 04 代码示例

财务管理软件,用表格导出账目明细

不论是工资收入&#xff0c;还是日常花销&#xff0c;每一笔钱都需要我们认真对待。然而&#xff0c;许多人在财务管理上仍然采用传统的纸质记账方式&#xff0c;这不仅容易丢失数据&#xff0c;还难以实现财务的统一管理。为此&#xff0c;我为大家推荐一款简单好用的记账软件…

Java中对象的创建和使用

创建类 类体属性方法 public class Student{ Student是类&#xff0c;属于引用数据类型&#xff0c;这个类型名就是&#xff1a;student //属性【存储数据采用变量的形式】 //由于变量定义在类体当中&#xff0c;方法体之外&#xff0c;这种变量称为成员变量 //所有的学生都有…

高效构建Java应用:Maven入门和进阶(二)

高效构建Java应用&#xff1a;Maven入门和进阶&#xff08;二&#xff09; 二.基于IDEA的Maven的工程创建2.1 梳理Maven工程GAVP属性2.2 Idea构建Maven JavaSE工程2.3 Idea构建Maven JavaEE工程2.4 Maven工程项目结构说明 二.基于IDEA的Maven的工程创建 2.1 梳理Maven工程GAVP…