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

对象的状态变化处理与工厂模式实现

一、引言

在 C++ 编程中,有效地处理对象的状态变化以及合理运用设计模式可以极大地提高代码的可维护性、可扩展性和可读性。本文将深入探讨 C++ 如何处理对象的状态变化以及如何实现工厂模式。

二、C++ 中对象的状态变化处理

  • 使用成员变量表示状态

class GameCharacter {public:int health;int energy;// 其他成员函数};

  • 在 C++ 中,对象的状态通常由成员变量来表示。例如,一个表示游戏角色的类可能有成员变量来表示生命值、能量值、位置等状态。
  • 通过修改这些成员变量的值,可以改变对象的状态。
  • 状态模式

class TrafficLight {public:virtual void display() = 0;};class RedLight : public TrafficLight {public:void display() override {cout << "Red Light" << endl;}};class YellowLight : public TrafficLight {public:void display() override {cout << "Yellow Light" << endl;}};class GreenLight : public TrafficLight {public:void display() override {cout << "Green Light" << endl;}};

  • 状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。
  • 例如,一个交通信号灯可以有三种状态:红灯、黄灯和绿灯。每个状态下信号灯的行为是不同的。
  • 通过在交通信号灯类中维护一个指向当前状态对象的指针,可以在状态变化时切换到不同的状态对象。
  • 观察者模式

class Stock {public:int price;vector<class Observer*> observers;void attach(Observer* observer) {observers.push_back(observer);}void detach(Observer* observer) {// 从观察者列表中移除指定观察者}void notify() {for (Observer* observer : observers) {observer->update();}}};class Observer {public:virtual void update() = 0;};class Investor : public Observer {public:void update() override {// 处理股票价格变化的通知}};

  • 观察者模式可以用于当对象的状态变化时通知其他对象。
  • 例如,一个股票交易系统中,当股票价格变化时,需要通知所有关注该股票的用户。

三、C++ 中工厂模式的实现

  • 简单工厂模式

class Shape {public:virtual void draw() = 0;};class Circle : public Shape {public:void draw() override {cout << "Drawing a circle" << endl;}};class Rectangle : public Shape {public:void draw() override {cout << "Drawing a rectangle" << endl;}};class ShapeFactory {public:static Shape* createShape(int type) {switch (type) {case 1:return new Circle();case 2:return new Rectangle();default:return nullptr;}}};

  • 简单工厂模式是一种创建型设计模式,它提供了一个创建对象的方法,根据传入的参数决定创建哪种具体的对象。
  • 例如,一个图形绘制系统中,可以使用简单工厂来创建不同类型的图形对象。
  • 使用简单工厂模式可以将对象的创建和使用分离,提高代码的可维护性。
  • 工厂方法模式

class Car {public:virtual void drive() = 0;};class Sedan : public Car {public:void drive() override {cout << "Driving a sedan" << endl;}};class SUV : public Car {public:void drive() override {cout << "Driving an SUV" << endl;}};class CarFactory {public:virtual Car* createCar() = 0;};class SedanFactory : public CarFactory {public:Car* createCar() override {return new Sedan();}};class SUVFactory : public CarFactory {public:Car* createCar() override {return new SUV();}};

  • 工厂方法模式是在简单工厂模式的基础上,将工厂的创建方法抽象成抽象方法,由具体的工厂子类实现。
  • 例如,在一个汽车制造系统中,可以有不同类型的汽车工厂,每个工厂负责生产特定类型的汽车。
  • 工厂方法模式更加符合开闭原则,即对扩展开放,对修改关闭。
  • 抽象工厂模式

class Chair {public:virtual void sit() = 0;};class Table {public:virtual void putThings() = 0;};class ModernChair : public Chair {public:void sit() override {cout << "Sitting on a modern chair" << endl;}};class ModernTable : public Table {public:void putThings() override {cout << "Putting things on a modern table" << endl;}};class AntiqueChair : public Chair {public:void sit() override {cout << "Sitting on an antique chair" << endl;}};class AntiqueTable : public Table {public:void putThings() override {cout << "Putting things on an antique table" << endl;}};class FurnitureFactory {public:virtual Chair* createChair() = 0;virtual Table* createTable() = 0;};class ModernFurnitureFactory : public FurnitureFactory {public:Chair* createChair() override {return new ModernChair();}Table* createTable() override {return new ModernTable();}};class AntiqueFurnitureFactory : public FurnitureFactory {public:Chair* createChair() override {return new AntiqueChair();}Table* createTable() override {return new AntiqueTable();}};

  • 抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  • 例如,一个家具制造系统中,可以有不同风格的家具工厂,每个工厂负责生产一系列相关的家具。
  • 抽象工厂模式适用于需要创建一组相关对象的场景。

四、总结

在 C++ 中,处理对象的状态变化可以使用成员变量、状态模式和观察者模式等方法。而工厂模式可以帮助我们更好地创建对象,提高代码的可维护性和可扩展性。不同的工厂模式适用于不同的场景,我们可以根据具体的需求选择合适的模式。通过合理地运用这些技术,我们可以写出更加优秀的 C++ 代码。

相关文章:

对象的状态变化处理与工厂模式实现

一、引言 在 C 编程中&#xff0c;有效地处理对象的状态变化以及合理运用设计模式可以极大地提高代码的可维护性、可扩展性和可读性。本文将深入探讨 C 如何处理对象的状态变化以及如何实现工厂模式。 二、C 中对象的状态变化处理 使用成员变量表示状态 class GameCharacte…...

关于IP代理API,我应该了解哪些功能特性?以及如何安全有效地使用它来隐藏我的网络位置?

IP代理API是一种服务&#xff0c;允许用户通过访问经过中间服务器的网络连接来改变其公开的互联网协议地址&#xff08;IP&#xff09;&#xff0c;从而达到隐藏真实地理位置的效果。以下是您在选择和使用IP代理API时应关注的一些功能和安全性考虑&#xff1a; 匿名度&#xff…...

在Linux上将 `.sh` 脚本、`.jar` 包或其他脚本文件添加到开机自启动

在Linux上将 .sh 脚本、.jar 包或其他脚本文件添加到开机自启动 在Linux环境中&#xff0c;有时需要将一些程序、脚本或应用程序设置为开机时自动启动。这对于那些需要在系统启动时启动的服务或应用非常有用。本文将介绍如何将 .sh 脚本、.jar 包或其他脚本文件添加到Linux系统…...

[Maven]构建项目与高级特性

有关于安装配置可以看我的另一篇文章&#xff1a;Maven下载安装配置与简介。 构建项目的生命周期和常用命令 这一节的内容熟记即可&#xff0c;要用了认得出来即可。 在Maven出现之前&#xff0c;项目构建的生命周期就已经存在。对项目进行清理、编译、测试、部署等一系列工作…...

【系统架构设计师】真题论文: 论数据分片技术及其应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2020年 试题1)解题思路论文素材参考Hash 分片原理一致性 Hash 分片原理按照数据范围(Range Based)分片原理项目采用的分片方式的实现过程和效果真题题目(2020年 试题1) 数据分片就是按照一定的规则…...

【bWAPP】XSS跨站脚本攻击实战

别低头&#xff0c;皇冠会掉&#xff1b;别流泪&#xff0c;贱人会笑。 0x01、XSS - Reflected (GET) Low 输入的内容直接输出到页面中: 后台服务端没有对输入的参数进行过滤, 构造一个注入xss payload即可: <script>alert(1)</script> 成功弹窗 Medium 审查…...

Ubuntu 22.04,Rime / luna_pinyin.schema 输入法:外挂词库,自定义词库 (****) OK

测试平台: Ubuntu 22.04 sudo apt install ibus-rime 实例 1 :不实用的 实例 2 :实用的 文件使用说明:已经内嵌在文件中了。 ====================================== 实例 1 :不实用的 一共需要 3 个文件,放在用户文件夹下:~/.config/ibus/rime/ # Test A @ Fi…...

多协议视频监控汇聚/视频安防系统Liveweb搭建智慧园区视频管理平台

智慧园区作为现代化城市发展的重要组成部分&#xff0c;不仅承载着产业升级的使命&#xff0c;更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化&#xff0c;将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…...

如何高效获取Twitter数据:Apify平台上的推特数据采集解决方案

引言 在数据分析和市场研究领域&#xff0c;Twitter&#xff08;现在的X&#xff09;数据一直是重要的信息来源。但是&#xff0c;自从Twitter更改API定价策略后&#xff0c;获取数据的成本大幅提升。本文将介绍一个经济实惠的替代方案。 为什么需要Twitter数据&#xff1f; …...

第二部分:进阶主题 15 . 安全管理 --[MySQL轻松入门教程]

MySQL 数据库的安全管理是一个多方面的工作,涉及到了解和配置数据库的访问控制、加密、备份与恢复策略、日志记录等多个方面。以下是一些关键点: 1. 用户权限管理 最小权限原则:每个用户应该只被授予完成其工作所需的最低限度的权限。定期审查权限:定期检查用户的权限,确…...

力扣hot100——双指针

283. 移动零 class Solution { public:void moveZeroes(vector<int>& nums) {for (int i 0, j 0; j < nums.size() || i < nums.size(); j) {if (j > nums.size()) {nums[i] 0;continue;}if (nums[j]) nums[i] nums[j];}} }; 双指针&#xff0c;一个指…...

【代码随想录day58】【C++复健】 117. 软件构建(拓扑排序);47. 参加科学大会(dijkstra(朴素版)精讲)

117. 软件构建&#xff08;拓扑排序&#xff09; 继续边看解析边做题&#xff0c;思考时的问题做个如下的总结&#xff1a; 1. 存边用什么数据结构&#xff1f; 在题目中&#xff0c;我们需要存储节点之间的依赖关系&#xff08;边信息&#xff09;。选择适合的数据结构非常重…...

【NLP 16、实践 ③ 找出特定字符在字符串中的位置】

看着父亲苍老的白发和渐渐老态的面容 希望时间再慢一些 —— 24.12.19 一、定义模型 1.初始化模型 ① 初始化父类 super(TorchModel, self).__init__()&#xff1a; 调用父类 nn.Module 的初始化方法&#xff0c;确保模型能够正确初始化。 ② 创建嵌入层 self.embedding n…...

费解的开关(bfs + 哈希表 or 递推)

题目描述: 25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。 我们用数字“1”表示一盏开着的灯,用数字“0”表示关…...

C语言——实现求出最大值

问题描述&#xff1a;利用C语言自定义函数求出一维数组里边最大的数字 //利用函数找最大数#include<stdio.h>int search(int s[9]) //查找函数 {int i , max s[0] , max_xia 0;for(i0;i<9;i){if(s[i] > max){max_xia i;max s[max_xia];}}return max; } in…...

基于微信小程序的短视频系统(SpringBoot)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

Flutter 中 Sliver 的各种装饰器介绍与使用

在 Flutter 中&#xff0c;Sliver 是一种可以在滚动视图中实现自定义效果的组件。Sliver 组件可以根据滚动位置动态改变其外观和行为。本文将介绍几种常用的 Sliver 装饰器及其使用方法。 1. SliverAppBar SliverAppBar 是一个可以随着滚动而变化的应用栏。它可以在用户向下滚…...

电感的基本概念

电感的定义&#xff1a; 电感一般是由导线绕成空芯线圈或带铁芯的线圈而制成。 当线圈中有电流通过时&#xff0c;线圈周围就会产生磁场&#xff0c;当线圈中流过的是直流电流时&#xff0c;线圆周围就会产生固定的磁场&#xff0c;线圈产生的物理现象就是电磁铁&#xff0c;当…...

linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程

系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…...

HTTP协议和接口测试详解

介绍接口测试前我们先来介绍一下HTTP协议&#xff0c;为什么先要介绍HTTP协议呢因为因为我们做接口测试其实就是用测试工具&#xff08;postman,fiddler,jmeter等等&#xff09;或代码来模拟用户使用软件的场景&#xff0c;在我们模拟的时候不像平时功能测试时我们有已经开发完…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...