设计模式:享元模式(C++实现)

2023-09-20 10:14:36

享元模式(Flyweight Pattern)是一种结构设计模式,它通过共享对象来有效地支持大量细粒度的对象。享元模式的目标是尽量减少内存使用,通过共享相同的数据来减少对象的数量。
以下是一个简单的C++享元模式的示例:

#include <iostream>
#include <unordered_map>

// 抽象享元类
class Flyweight
{
public:
    virtual void operation() = 0;
};

// 具体享元类
class ConcreteFlyweight : public Flyweight
{
private:
    std::string intrinsicState;

public:
    ConcreteFlyweight(const std::string &intrinsicState) : intrinsicState(intrinsicState) {}
    void operation() override
    {
        std::cout << "Concrete Flyweight: " << intrinsicState << std::endl;
    }
};

// 享元工厂类
class FlyweightFactory
{
private:
    std::unordered_map<std::string, Flyweight *> flyweights;

public:
    Flyweight *getFlyweight(const std::string &intrinsicState)
    {
        if (flyweights.find(intrinsicState) == flyweights.end())
        {
            flyweights[intrinsicState] = new ConcreteFlyweight(intrinsicState);
        }
        return flyweights[intrinsicState];
    }
    ~FlyweightFactory()
    {
        for (auto it = flyweights.begin(); it != flyweights.end(); ++it)
        {
            delete it->second;
        }
        flyweights.clear();
    }
};

int main()
{
    FlyweightFactory flyweightFactory;
    Flyweight *flyweight1 = flyweightFactory.getFlyweight("state1");
    Flyweight *flyweight2 = flyweightFactory.getFlyweight("state2");
    Flyweight *flyweight3 = flyweightFactory.getFlyweight("state2");
    flyweight1->operation();
    flyweight2->operation();
    flyweight3->operation();
    return 0;
}

运行结果:

Concrete Flyweight: state1
Concrete Flyweight: state2
Concrete Flyweight: state2

在上述示例中,Flyweight是抽象享元类,定义了享元对象的接口。ConcreteFlyweight是具体享元类,实现了具体的享元对象。FlyweightFactory是享元工厂类,负责创建和管理享元对象。
在main()函数中,首先创建了一个享元工厂对象flyweightFactory。然后通过调用getFlyweight()方法来获取享元对象。如果工厂中不存在对应的享元对象,则创建一个新的享元对象并将其存储在工厂中;如果已存在对应的享元对象,则直接返回该对象。最后,通过调用享元对象的operation()方法来执行操作。
通过享元模式,可以减少对象的数量,节省内存空间。相同的数据可以被多个对象共享,从而降低了系统的开销。享元模式适用于需要创建大量相似对象的场景,可以提高系统的性能和效率。

更多推荐

【Tensorflow 2.12 电影推荐系统之排序模型】

Tensorflow2.12电影推荐系统之排序模型学习笔记导入相关模块准备数据加载数据数据预处理获取词汇表构建模型定义评分排序模型定义损失函数以及模型评估指标定义完整的评分排序模型训练和评估创建排序模型实例缓存数据训练评估预测导出和加载模型结尾学习笔记Tensorflow2.12智能电影推荐系统搭建学习笔记~Tenso

电压放大器在电子测试中的应用有哪些方面

电压放大器是一种常见的电子设备,广泛应用于各种测试和测量应用中。以下是电压放大器在电子测试中的几个主要方面应用的简要介绍。信号采集与处理:电压放大器通常用于信号采集和处理,在测试过程中将低电平信号放大到适合进一步处理或分析的水平。例如,在生物医学领域,电压放大器常用于心电图和脑电图等生理信号的采集和放大。它们能够将微弱

单片机内存管理

源码说明源码包含memory.h和memory.c两个文件(嵌入式C/C++代码的“标配”),其源码中包含重要的注释。memory.h文件包含结构体等定义,函数API申明等;memory.c文件是实现内存管理相关API函数的原型。memory.h头文件是相关的定义和申请:#ifndef__MEMORY_H__#defi

Python爬虫实战案例——第五例

文章中所有内容仅供学习交流使用,不用于其他任何目的!严禁将文中内容用于任何商业与非法用途,由此产生的一切后果与作者无关。若有侵权,请联系删除。目标:采集三国杀官网的精美壁纸地址:aHR0cHM6Ly93d3cuc2FuZ3Vvc2hhLmNvbS9tc2dzL21XYWxsUGFwZXI=从开发者工具中进行分析可以看到

不可变集合的详细概述

1.不可变集合1.1什么是不可变集合是一个长度不可变,内容也无法修改的集合1.2使用场景如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。当集合对象被不可信的库调用时,不可变形式是安全的。简单理解:不想让别人修改集合中的内容比如说:1,斗地主的54张牌,是不能添加,不能删除,不能修改的2,斗地主的打

在工作流引擎设计领域,是否自动计算未来的处理人的设计模式有哪些?

概述流程的第一个节点发送下去的时候,就要把以后所有节点的处理人计算出来,能清楚的知道每个节点都是那些人处理.以驰骋bpm为例来说明这个设计计算未来处理人包括抄送节点、与待办节点.默认的模式为:每个节点发送的时候即使计算,就是不计算未来处理人.流程设计特征.流程的所有节点的接受人不能是主管选择的,只能是自动计算.节点的转

SpringBoot之yaml

文章目录前言一、基本语法二、数据类型介绍实例三、配置提示总结前言YAML是“YAMLAin’tMarkupLanguage”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:“YetAnotherMarkupLanguage”(仍是一种标记语言)。非常适合用来做以数据为中心的配置文件。一

奥特曼与钢铁侠【InsCode Stable Diffusion美图活动一期】

文章目录简介图片生成步骤更多体验方式简介InsCode是一个一站式的软件开发服务平台,从开发-部署-运维-运营,都可以在InsCode轻松完成。InsCode的Ins是Inspiration,意思是创作、寻找有灵感的代码。StableDiffusion是文图生成模型,也可以理解成是AI动画生成工具。在线运行地址:htt

数据结构和算法之归并排序

归并排序(MergeSort)是一种基于分治思想的排序算法,通过将待排序的数组分成两个子数组,分别对两个子数组进行排序,最后将排序好的子数组合并成一个有序数组。它的基本思想是将两个有序的子序列合并成一个有序的序列。代码如下://归并排序算法functionmergeSort(arr){//递归出口,当数组长度小于等于1

ELK 企业级日志分析系统

ELK概述1、ELK简介ELK平台是一套完整的日志集中处理解决方案,将ElasticSearch、Logstash和Kiabana三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求。ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。Ela

Java虚拟机栈

Java虚拟机栈(JavaVirtualMachineStack)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(StackFrame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的

热文推荐