我们这里以聊天软件为例,当我们和好友在不同的群聊中,同一个头像会出现在多个地方,由于图片都相比较耗费资源。我们可以通过用户的ID维护一个头像的Map,这时候,除了第一次是图片加载到内存中,后续所有的头像都是拿到了当前这个头像的引用,进而减小了整个程序的内存占用。
我们这里用户头像为例子
/* 抽象享元类接口 */
class I_Image {
public:
virtual ~I_Image(){};
virtual void Operation() = 0;
};
class UserHeader : public I_Image {
private:
string str;
public:
UserHeader(string str) { this->str = str; }
void Operation() { cout << "user header image is : " << str << endl; }
};
class ImageFactory {
public:
ImageFactory() {}
std::shared_ptr<I_Image> GetImage(string obj)
{
std::shared_ptr<I_Image> item_image = nullptr;
//如果没有找到对应的图片则创建
if (image_map_.count(obj) == 0) {
cout << "No find user header and Create Header= " << obj << endl;
item_image = std::make_shared<UserHeader>(obj);
image_map_.insert(std::map<std::string, std::shared_ptr<I_Image>>::value_type(obj, item_image));
}
return image_map_[obj];
}
int GetImageMapSize() {
return image_map_.size();
}
private:
map<string, std::shared_ptr<I_Image>> image_map_;
};
int main()
{
std::shared_ptr<ImageFactory> image_factory = std::make_shared<ImageFactory>();
std::shared_ptr<I_Image> header_1 = image_factory->GetImage("zhangsan");
std::shared_ptr<I_Image> header_2 = image_factory->GetImage("lisi");
std::shared_ptr<I_Image> header_3 = image_factory->GetImage("zhangsan");
std::shared_ptr<I_Image> header_4 = image_factory->GetImage("xiaoming");
std::shared_ptr<I_Image> header_5 = image_factory->GetImage("xiaohong");
std::shared_ptr<I_Image> header_6 = image_factory->GetImage("lisi");
cout << "======================================================"<< endl;
cout << "image_factory size = " << image_factory->GetImageMapSize() << endl;
cout << "======================================================" << endl;
header_1->OutPutImage();
header_2->OutPutImage();
header_3->OutPutImage();
header_4->OutPutImage();
header_5->OutPutImage();
header_6->OutPutImage();
return 0;
}

优点:
缺点:
总结: