首页 / 设计模式 / 【C++设计模式】享元模式
【C++设计模式】享元模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【C++设计模式】享元模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2217字,纯文字阅读大概需要4分钟。
内容图文
#ifndef __FLYWEIGHT_H__
#define __FLYWEIGHT_H__
#include <iostream>
#include <string>
#include <map>
//享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。
//在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。
//享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。
//1) 内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,因此内部状态可以共享。
//2) 外部状态是随环境改变而改变的、不可以共享的状态。享元对象的外部状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。
//3) 必须要注意,如果改变被共享的对象,就会对多个地方产生影响,所以在决定FlyWeight对象的字段时,只将那些真正需要在多个地方共享的字段定义在FlyWeight角色中即可。
//享元模式的优点在于它可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份。
//享元模式的缺点是使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化,所以应当在多次重复使用享元对象时才值得使用享元模式。
//轻量级对象
class FlyWeight
{
public:
FlyWeight();
FlyWeight(std::string key);
virtual void Operate(int value); //value外部状态
private:
std::string m_key; //m_key内部状态
};
//享元工厂,管理和维护轻量级对象
class FlyWeightFactory
{
public:
FlyWeight * GetFlyWeight(std::string key);
private:
std::map<std::string, FlyWeight*> m_flymap;
};
void TestFlyWeight();
#endif
#include "Flyweight.h"
FlyWeight::FlyWeight()
{
}
FlyWeight::FlyWeight(std::string key) : m_key(key)
{
}
void FlyWeight::Operate(int value)
{
printf("ConcreteFlyWeight m_key[%s], value[%d]\n", m_key.c_str(), value);
}
FlyWeight * FlyWeightFactory::GetFlyWeight(std::string key)
{
std::map<std::string, FlyWeight*>::iterator it = m_flymap.find(key);
if (it != m_flymap.end())
{
return it->second;
}
FlyWeight * fly = new FlyWeight(key);
m_flymap.insert(std::map<std::string, FlyWeight*>::value_type(key,fly));
return fly;
}
void TestFlyWeight()
{
FlyWeightFactory * flyFactory = new FlyWeightFactory();
FlyWeight * fly1 = flyFactory->GetFlyWeight("X");
FlyWeight * fly2 = flyFactory->GetFlyWeight("Y");
FlyWeight * fly3 = flyFactory->GetFlyWeight("X");
FlyWeight * fly4 = flyFactory->GetFlyWeight("X");
fly1->Operate(11);
fly4->Operate(15);
}
内容总结
以上是互联网集市为您收集整理的【C++设计模式】享元模式全部内容,希望文章能够帮你解决【C++设计模式】享元模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。
来源:【匿名】