图片引用于百度
简介:主要用于减少创建对象的数量,以减少内存占用和提高性能。
优点:大大的减少了对象的创建,如果对象调用率高,能极大的减少内存占用
缺点:为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性
例子背景:现在有个商店,批发商要过来问有没有这个商品,没有我就创建一个给他,有就直接给他
享元模式代码:
- 抽象商店类:
#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.youkuaiyun.com/u014732297(转载请说明出处)