大话设计模式之享元模式

享元模式是一种结构型设计模式,旨在有效地支持大量细粒度的对象共享,从而减少内存消耗和提高性能。

在享元模式中,对象分为两种:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是对象可以共享的状态,它存储在享元对象内部,并且不会随着外部环境的改变而改变;外部状态是对象的外部环境可以变化的部分,它由客户端传递给享元对象,并且在享元对象之外维护。

享元模式的关键是使用共享对象来减少内存使用和提高性能。当需要创建新对象时,首先检查是否已经存在具有相同内部状态的对象,如果存在,则返回该对象的引用;如果不存在,则创建一个新对象并将其加入到共享池中,以便下次可以重复使用。

#include <iostream>
#include <map>
#include <string>// 抽象享元类
class Flyweight {
public:virtual ~Flyweight() {}virtual void operation(const std::string& unique_state) const = 0;
};// 具体享元类
class ConcreteFlyweight : public Flyweight {
public:ConcreteFlyweight(const std::string& shared_state) : shared_state_(shared_state) {}void operation(const std::string& unique_state) const override {std::cout << "ConcreteFlyweight: Shared state (" << shared_state_ << "), Unique state (" << unique_state << ")\n";}private:std::string shared_state_;
};// 享元工厂类
class FlyweightFactory {
public:Flyweight* getFlyweight(const std::string& shared_state) {if (flyweights_.find(shared_state) == flyweights_.end()) {flyweights_[shared_state] = new ConcreteFlyweight(shared_state);}return flyweights_[shared_state];}~FlyweightFactory() {for (auto it = flyweights_.begin(); it != flyweights_.end(); ++it) {delete it->second;}flyweights_.clear();}private:std::map<std::string, Flyweight*> flyweights_;
};int main() {FlyweightFactory factory;Flyweight* flyweight1 = factory.getFlyweight("shared_state_1");flyweight1->operation("unique_state_1");Flyweight* flyweight2 = factory.getFlyweight("shared_state_2");flyweight2->operation("unique_state_2");Flyweight* flyweight3 = factory.getFlyweight("shared_state_1");flyweight3->operation("unique_state_3");return 0;
}/*
在这个示例中,Flyweight 是抽象享元类,定义了操作接口 operation()。
ConcreteFlyweight 是具体享元类,实现了抽象享元类的接口。
FlyweightFactory 是享元工厂类,负责创建和管理享元对象。在 main() 函数中,我们使用享元工厂来获取享元对象,并且重复使用了具有相同内部状态的对象。*/

觉得有帮助的话,打赏一下呗。。

           

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

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

相关文章

录屏软件有哪些?分享4款好用的工具!

随着网络视频内容的日益丰富&#xff0c;录屏软件成为了许多用户必备的工具。无论你是需要制作教学视频、游戏直播、会议记录还是简单的视频剪辑&#xff0c;一款功能强大、操作简便的录屏软件都是不可或缺的。那么&#xff0c;市面上究竟有哪些录屏软件值得一试呢&#xff1f;…

代理模式:控制对象访问的智能方式

在面向对象的软件开发中&#xff0c;代理模式是一种结构型设计模式&#xff0c;它为其他对象提供一个代理或占位符以控制对这个对象的访问。代理模式在实现权限控制、延迟初始化和远程对象访问等方面非常有用。本文将详细介绍代理模式的定义、实现、应用场景以及优缺点&#xf…

Jackson 2.x 系列【23】注解内省 AnnotationIntrospector

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. AnnotationIntrospector3. JacksonAnnotationIntrospector4. Annotati…

基于springboot实现医疗病历互换系统项目【项目源码+论文说明】

基于springboot实现医疗病历交互系统演示 摘要 进入21世纪&#xff0c;计算机技术迅速向着网络化的、集成化方向发展。传统的单机版应用软件正在逐渐退出舞台&#xff0c;取而代之的是支持网络、支持多种数据信息的新一代网络版应用软件&#xff0c;形成了信息化的社会。信息…

【canvas】canvas基础使用(七):绘制图像

简言 学习canvas如何绘制图片或视频。 绘制图像 给定一个图像&#xff0c;一般使用drawImage()方法绘制。 drawImage 绘制图像 Canvas 2D API 中的 CanvasRenderingContext2D.drawImage() 方法提供了多种在画布&#xff08;Canvas&#xff09;上绘制图像的方式。 语法&…

C语言单链表详解

链表和顺序表的区别 顺序表的底层存储空间是连续的&#xff0c;链表的底层存储空间是不连续的&#xff0c;链表的每个节点需要额外的指针来指向下一个节点&#xff0c;占用更多的存储空间。 顺序表的随机访问性能好&#xff0c;时间复杂度为O(1)&#xff0c;链表的随机访问性能…

【C++软件调试技术】C++软件开发维护过程中典型调试问题的解答与总结

目录 1、引发C软件异常的常见原因有哪些&#xff1f; 2、排查C软件异常的常用方法有哪些&#xff1f; 3、为什么要熟悉常见的异常内存地址&#xff1f; 4、调试时遇到调用IsBadReadPtr或者IsBadWritePtr引发的异常&#xff0c;该如何处理&#xff1f; 5、如何排查GDI对象泄…

Oracle 获取最大值,第二大,第三大,第 N 大值

目录 1、原始数据2、获取最大值记录3、获取第二大值记录4、获取第三大值记录 1、原始数据 select * from test_2024_04_15_001 order by 销量 desc,渠道2、获取最大值记录 select 渠道,销量 from ( select a.渠道, a.销量 from test_2024_04_15_001 a order by a.销量 desc,…

Arcade 加载本地文本

参考 https://api.arcade.academy/en/latest/examples/text_loc_example.html#text-loc-example 代码 """ Example showing how to draw text to the screen.If Python and Arcade are installed, this example can be run from the command line with: pyth…

极大似然估计、最大后验估计、贝叶斯估计

机器学习笔记 第一章 机器学习简介 第二章 感知机 第三章 支持向量机 第四章 朴素贝叶斯分类器 第五章 Logistic回归 第六章 线性回归和岭回归 第七章 多层感知机与反向传播【Python实例】 第八章 主成分分析【PCA降维】 第九章 隐马尔可夫模型 第十章 奇异值分解 第十一章 熵…

【随笔】Git 高级篇 -- 获取远程分支数据 git fetch(二十七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

代码随想录算法训练营DAY27|C++回溯算法Part.3|39.组合总和、40.组合总和II、组合问题小总结、131.分割回文串

文章目录 39.组合总和思路伪代码实现剪枝优化CPP代码普通版本剪枝版本 40.组合总和II思路伪代码CPP代码不采用used数组的去重方法 组合问题小总结131.分割回文串思路伪代码CPP代码 39.组合总和 力扣题目链接 文章讲解&#xff1a;39.组合总和 视频讲解&#xff1a;Leetcode:39.…