C++25设计模式之享元模式

在这里插入图片描述
图片引用于百度

简介:主要用于减少创建对象的数量,以减少内存占用和提高性能。

优点:大大的减少了对象的创建,如果对象调用率高,能极大的减少内存占用

缺点:为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性

例子背景:现在有个商店,批发商要过来问有没有这个商品,没有我就创建一个给他,有就直接给他

享元模式代码:

  • 抽象商店类:
#pragma once
#include <string>
#include <iostream>
using namespace std;

class BaseGoods
{
public:
        BaseGoods() = default;
        virtual ~BaseGoods() = default;
public:
        virtual string GetGoodsName() = 0;
};
  • 具体商店类:
#pragma once
#include "BaseGoods.h"

class Goods : public BaseGoods
{
private:
        string m_goodsName;
public:
        Goods(const string& n) : m_goodsName(n) {}
        virtual ~Goods() {}
public:
        virtual string GetGoodsName()
        {
                return m_goodsName;
        }
};
  • 商店工厂类:
#pragma once
#include <unordered_map>
#include "Goods.h"

#define UNUSED(p) (p) //去除 warning C4101未引用的局部变量 警告

class GoodsFactory
{
public:
        GoodsFactory() {}
        ~GoodsFactory()
        {
                for (auto iter : m_goodsHash)
                {
                        delete iter.second;
                        iter.second = nullptr;
                }
        }
private:
        unordered_map<string, Goods*> m_goodsHash;
public:
        Goods* GetGoods(const string& godName)
        {
                Goods* g = nullptr;
                try
                {
                        g = m_goodsHash.at(godName);
                }
                catch (out_of_range& oor)
                {
                        UNUSED(oor);
                        g = new Goods(godName);
                        m_goodsHash.insert(make_pair(godName, g));
                        cout << "获取了" << godName << "商品,没有查到,创建一个新的商品" << endl;
                }
                return g;
        }
        auto GetHashSize()
        {
                return m_goodsHash.size();
        }
};
  • 引用:
#include "GoodsFactory.h"

int main()
{
        shared_ptr<GoodsFactory> gf(new GoodsFactory);
        auto g1 = gf->GetGoods("i3主机");
        cout << "商品名:" << g1->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g2 = gf->GetGoods("i5主机");
        cout << "商品名:" << g2->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g3 = gf->GetGoods("i7主机");
        cout << "商品名:" << g3->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g4 = gf->GetGoods("i9主机");
        cout << "商品名:" << g4->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g5 = gf->GetGoods("i3主机");
        cout << "商品名:" << g5->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g6 = gf->GetGoods("i5主机");
        cout << "商品名:" << g6->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g7 = gf->GetGoods("i7主机");
        cout << "商品名:" << g7->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g8 = gf->GetGoods("i9主机");
        cout << "商品名:" << g8->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g9 = gf->GetGoods("i3主机");
        cout << "商品名:" << g9->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g10 = gf->GetGoods("i5主机");
        cout << "商品名:" << g10->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g11 = gf->GetGoods("i7主机");
        cout << "商品名:" << g11->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;
        auto g12 = gf->GetGoods("i9主机");
        cout << "商品名:" << g12->GetGoodsName() << ",商品对象size:" << gf->GetHashSize() << endl;

        getchar();
        return 0;
}

总结:
享元模式(Flyweight):使用哈希表保存具有代表性的类,当外部访问时直接返回哈希表内保存的对象指针,没有就创建,对于使用量大,又可以共享的类,可以极大的减少内存占用

作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值