设计模式之享元模式(Flyweight)的C++代码实现

news2024/9/28 7:24:59

1、享元模式提出

面向对象很好地解决了抽象问题,但是创建对象会带来一定的内存开销。绝大部分情况下,创建对象带来的内存开销是可以忽略不计的;在有些情况下是需要谨慎处理的,如类A的sizeof是50个字节,则创建50*1024*100个A对象,则对象的内存大小约为5MB,这个是很占用内存的。享元模式就是使用运用共享技术支持创建大量的对象情况,并同时减少内存开销。

2、需求描述

有3种类型产品,这几种类型产品的形状和大小各不相同;现有1000个产品(3种类型),分别输出这些产品的类型和大小。

3、享元模式的代码实现

#include <iostream>
#include <string>
#include <map>
#include <vector>
namespace FlyWeight {
const std::string strG1="G1";
const std::string strG2="G2";
const std::string strG3="G3";

class AbsProduct
{
public:
    virtual void Shape()=0;
    virtual void Size()=0;
    std::string m_strType;
    virtual ~AbsProduct(){};
};

class ProductA:public AbsProduct
{
public:
    virtual void Shape()
    {
        std::cout << "rectangle" << std::endl;
    };
    virtual void Size()
    {
        std::cout << "60*60" << std::endl;
    };
};

class ProductB:public AbsProduct
{
public:
    virtual void Shape()
    {
        std::cout << "triangle" << std::endl;
    };
    virtual void Size()
    {
        std::cout << "30*40*50" << std::endl;
    };
};

class ProductC:public AbsProduct
{
public:
    virtual void Shape()
    {
        std::cout << "polygon" << std::endl;
    };
    virtual void Size()
    {
        std::cout << "30*40*50*60*60" << std::endl;
    };
};

class ProductFact
{
 private:
    std::map<std::string,AbsProduct*>mapProduts;
public:
    AbsProduct* GetProduct(std::string strType)
    {
        auto it = mapProduts.find(strType);
        if(it != mapProduts.end())
        {
            return it->second;
        }else
        {
            AbsProduct* newProduct = nullptr;
          if(strG1 == strType)
          {
              newProduct = new ProductA();
          }else if(strG2 == strType)
          {
              newProduct = new ProductB();
          }else
          {
              newProduct = new ProductC();
          }
               mapProduts[strType] = newProduct;
               return newProduct;
        }
    };

void clear()
{
    for(auto it = mapProduts.begin(); it != mapProduts.end(); it++)
    {
        delete (it->second);
        it->second = nullptr;
    }
}
};
}


std::vector<std::string>vecProducts;
int main()
{
    for(int i = 0; i < 1000* 1; i++)
    {
        if(i % 3 == 0)
        {
            vecProducts.emplace_back(FlyWeight::strG1);
        }else if(i % 3 == 1)
        {
            vecProducts.emplace_back(FlyWeight::strG2);
        }else{
            vecProducts.emplace_back(FlyWeight::strG3);
        }
    }
    FlyWeight::ProductFact obj;
    for(auto it = vecProducts.begin(); it != vecProducts.end();it++)
    {
        std::cout << "\n";
        FlyWeight::AbsProduct *objIter= obj.GetProduct(*it);
        std::cout << objIter << std::endl;
        objIter->Size();
        objIter->Shape();
    }
    obj.clear();
    vecProducts.clear();

    return 0;
}

运行结果如下:

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

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

相关文章

AIGC:从入门到精通

一、前言 相信一部分的人在看到本活动的主题是关于AIGC的时候&#xff0c;都会存在疑惑--到底什么是AIGC呢&#xff1f;故本文主要介绍关于AIGC的基本内容&#xff0c;全部内容采用自己搭建的ChatGPT模型生成&#xff0c;具体内容如下&#xff1a; 本文章&#xff0c;参与&…

互联网医院|申办互联网医院这些资质不能少

互联网医院作为一种创新的医疗模式&#xff0c;正在以其便捷、智能、人性化的特点改变着人们的生活方式和医疗体验。它以数字化技术和合作共赢的精神&#xff0c;打开了医疗的新纪元。让我们共同期待&#xff0c;互联网医院将为健康事业带来更多机遇和挑战&#xff0c;引领着健…

Spyglass 脚本

Spyglass小白可以使用Gui界面进行debug Spyglass检查(一)作为IC设计人员&#xff0c;熟练掌握数字前端语法检查工具Spyglass的重要性不言而喻&#xff0c;本文讲解景芯SoChttps://mp.weixin.qq.com/s/fp07o-AvaQvLT79Di0Tb7A 熟悉电路和软件之后可以使用脚本完成整个流程 sp…

【分享】使用FileChannel进行文件拷贝

前言: 项目实际编写中&#xff0c;使用到了多种文件拷贝方式&#xff0c;有包括专门使用c写了拷贝工具&#xff0c;供给Java调用&#xff0c;也有使用标准的输入输出流&#xff0c;这里分享的是借助 FileChannel 来读写,nio中传送数据使用channelbuffer&#xff0c;大的数据可以…

第九章 动态规划part09(代码随想录)

198.打家劫舍 题目&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。…

图的顺序存储结构

目录 图的顺序存储结构 图的顺序存储结构C语言实现 图的邻接表存储结构详解 邻接表计算顶点的出度和入度 图的十字链表存储结构 图的邻接多重表存储结构 图的顺序存储结构 使用图结构表示的数据元素之间虽然具有“多对多”的关系&#xff0c;但是同样可以采用顺序存储&a…

网络通信原理总结(第五十二课)

网络通信原理 结构目录 1 TCP/IP协议追层分析物理层(第三十九课)_IHOPEDREAM的博客-CSDN博客 2 网络通信TCP/IP协议逐层分析数据链路层(第四十课)_IHOPEDREAM的博客-CSDN博客 3 网络通信原理数据链路层&数制转换(第四十一课)_IHOPEDREAM的博客-CSDN博客 4 网络通信原理…

[LeetCode]矩阵对角线元素的和

解题 思路 1: 循环,找到主对角线的下标和副对角线的下标,如果矩阵长或宽为奇数的时候,需要减去中间公共的那一个值,中间公共的那个数的下标为mat[mat.size()/2][mat.size()/2]副对角线的下标为 mat [i][mat.size()-i-1] class Solution { public:int diagonalSum(vector<ve…

一文读懂|Linux 虚拟文件系统(VFS)

前言 虚拟文件系统是一个很庞大的架构&#xff0c;如果要分析的面面俱到&#xff0c;会显得特别复杂而笨拙&#xff0c;让人看着看着&#xff0c;就不知所云了&#xff08;当然主要还是笔者太菜&#xff09;&#xff0c;所以这篇博客&#xff0c;以 open() 函数为切入点&#…

2020年3月全国计算机等级考试真题(C语言二级)

2020年3月全国计算机等级考试真题&#xff08;C语言二级&#xff09; 第1题 有以下程序 void fun1 (char*p) { char*q; qp; while(*q!\0) { (*Q); q&#xff1b; } } main() { char a[]{"Program"},*p; p&a[3]; fun1(p); print…

英语学习 Eudic欧路词典 for Mac

欧路词典是一款功能强大的英语学习工具&#xff0c;其多语种支持、海量词库、强大的翻译功能、听力训练和生词本和笔记等特点&#xff0c;使得用户可以方便地进行英语学习和提高英语水平&#xff0c;适用于各种英语学习人员和文化交流人员等不同人群。 1 、全面支持最新Retina…

Salesforce Winter ‘24即将发布!亮点功能抢先看

随着Winter 24脚步的临近&#xff0c;一波增强功能即将面世&#xff0c;Trailblazers的期望值越来越高。在这片云计算的海洋里&#xff0c;一些亮点功能总能在生态系统中引起巨大轰动。 Winter 24发布日期 Winter 24发布的具体日期取决于您的Salesforce实例&#xff0c;主要日…

vue echarts macd指标 完整代码

1 逻辑 给指定的series两个对象 两个对象有相同的xAxisIndex: 2,yAxisIndex: 2, 不同的data {name: "",type: "line",data: data1,xAxisIndex: 2,yAxisIndex: 2,},{name: "",type: "bar",data: data2,xAxisIndex: 2,yAxisIndex: 2,},…

爱荷华州的一个学区正在使用ChatGPT来决定禁止哪些书籍

为了响应爱荷华州最近颁布的立法&#xff0c;管理员们正在从梅森市学校图书馆移除禁书&#xff0c;官员们正在使用ChatGPT帮助他们挑选书籍&#xff0c;根据公报和大众科学. 由州长金雷诺兹签署的禁令背后的新法律是教育改革浪潮的一部分&#xff0c;共和党立法者认为这是保护…

滑块验证码-接口返回base64数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言所需包图片示例使用方法提示前言 滑动验证码在实际爬虫开发过程中会遇到很多,不同网站返回的数据也是千奇百怪。这里分享一种接口返回base64格式的情况以及处理方式 所需包 opencv-python、…

【LangChain】Feature Store 特征库 一种新型存储方式 —— 功能存储

Feature Store 特征库 特征库的主要目的是什么&#xff1f;特征库的五个主要组件组成一&#xff1a;Serving 服务组成二&#xff1a;Storage 存储组成三&#xff1a;Transform 转换组成四&#xff1a;Monitoring 监控组成五&#xff1a;Feature Registry 功能注册表 Feature St…

简单学习MySQL

最近&#xff0c;再看数据库相关的知识&#xff0c;用不着学太深&#xff0c;先学一些基本知识&#xff0c;以后需要的时候有个基础&#xff0c;不至于像个无头苍蝇&#xff0c;我学习的网站如下&#xff08;MySQL 教程 | 菜鸟教程 (runoob.com)&#xff09; 对MySQL的介绍 My…

[oneAPI] 手写数字识别-VAE

[oneAPI] 手写数字识别-VAE oneAPIVAE模型实现手写数字识别任务定义使用包定义参数加载数据VAE模型与介绍训练过程结果 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI&#xff1a;https://devcloud.intel.com/one…

go 中自定义包以及import

目录结构如下 注意ellis这个文件夹是在工作区的src目录下 testpackage.go package testpackageimport ("fmt" )func Test() {fmt.Println("test") }main.go package mainimport ("ellis/testpackage""fmt" )type Name struct {Fir…

电脑PDF转换成PPT?这篇文章给你答案

随着科技的不断发展和进步&#xff0c;电子文档已经成为我们日常工作和学习中不可或缺的一部分。PDF作为一种跨平台的文件格式&#xff0c;以其可靠性和易读性而备受推崇。然而&#xff0c;在某些情况下&#xff0c;我们可能需要电脑PDF转换成PPT&#xff0c;以便更好地展示和编…