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

享元模式(C++)

定义:享元模式是一种结构型设计模式,它使用共享对象,用以尽可能减少内存使用和提高性能。享元模式通过共享已经存在的对象实例,而不是每次需要时都创建新对象实例,从而避免大量重复对象的开销。

对比:

        单例模式对比:两者都限制了对象的创建,不同之处在于单例模式全局只有一个实例,而享元模式会在状态相同时共享同一个实例。

        与原型模式对比:虽然原型模式不涉及状态的共享,但通过现有对象来创建一个新对象,达到了新对象和原对象“内容”上的一致。在实现原型模式时,根据场景也可以使用享元模式来优化对象的存储和创建过程。

        代码:

// 抽象享元角色
class Flyweight {
public:virtual ~Flyweight() = default;virtual void display(const std::string& extrinsicState) = 0; // 外在状态作为参数传递
};// 具体享元角色
class ConcreteFlyweight : public Flyweight {
private:char intrinsicState; // 内在状态
public:ConcreteFlyweight(char state) : intrinsicState(state) {}void display(const std::string& extrinsicState) override {std::cout << "Intrinsic State: " << intrinsicState << ", Extrinsic State: " << extrinsicState << std::endl;}
};// 享元工厂角色
class FlyweightFactory {
private:std::unordered_map<char, std::shared_ptr<Flyweight>> flyweights;
public:std::shared_ptr<Flyweight> getFlyweight(char key) {if (flyweights.find(key) == flyweights.end()) {flyweights[key] = std::make_shared<ConcreteFlyweight>(key);}return flyweights[key];}
};// 客户端角色
class Client {
private:std::shared_ptr<FlyweightFactory> factory;
public:Client(std::shared_ptr<FlyweightFactory> f) : factory(f) {}void execute(char key, const std::string& extrinsicState) {std::shared_ptr<Flyweight> flyweight = factory->getFlyweight(key);flyweight->display(extrinsicState);}
};int main() {std::shared_ptr<FlyweightFactory> factory = std::make_shared<FlyweightFactory>();Client client(factory);client.execute('A', "Position (10, 20)");client.execute('B', "Position (15, 25)");client.execute('A', "Position (20, 30)"); // 'A' 是共享的,所以使用相同的实例return 0;
}

http://www.lryc.cn/news/459402.html

相关文章:

  • 开发一个UniApp需要多长时间
  • 服务器源IP暴露后的安全风险及防御措施
  • YoloV8改进策略:BackBone改进|CAFormer在YoloV8中的创新应用,显著提升目标检测性能
  • 网络编程(19)——C++使用asio协程实现并发服务器
  • 【SQL】深入了解 SQL 索引:数据库性能优化的利器
  • 河道垃圾数据集 水污染数据集——无人机视角数据集 共3000张图片,可直接用于河道垃圾、水污染功能检测 已标注yolo格式、voc格式,可直接训练;
  • [棋牌源码] 2023情怀棋牌全套源代码含多套大厅UI及600+子游源码下载
  • 深度学习:预训练模型(基础模型)详解
  • 欧科云链研究院深掘链上数据:洞察未来Web3的隐秘价值
  • 国外电商系统开发-运维系统登录阈值
  • 设备台账管理是什么
  • 操作教程|基于DataEase用RFM分析法分析零售交易数据
  • 使用Go语言的gorm框架查询数据库并分页导出到Excel实例
  • Run the FPGA VI 选项的作用
  • 新手入门怎么炒股,新手炒股入门需要做哪些准备?
  • Fetch 与 Axios:JavaScript HTTP 请求库的详细比较
  • 记录一个Ajax发送JSON数据的坑,后端RequestBody接收参数小细节?JSON对象和JSON字符串的区别?
  • 【智能算法应用】长鼻浣熊优化算法求解二维路径规划问题
  • 微服务中的负载均衡算法与策略深度解析
  • 初知C++:AVL树
  • [LeetCode] 67. 二进制求和
  • 工业物联网关-ModbusTCP
  • 子组件向父组件传值$emit
  • 校车购票微信小程序的设计与实现(lw+演示+源码+运行)
  • 【Golang】关于Go语言中的定时器原理与实战应用
  • matlab不小心删除怎么撤回
  • 云原生、云计算、虚拟化概念概述
  • 【Trulens框架】用TruLens 自动化 RAG 应用项目评估测试
  • 互联网线上融合上门洗衣洗鞋小程序,让洗衣洗鞋像点外卖一样简单
  • R语言绘制三维散点图