享元模式——运用共享技术有效地支持大量细粒度的对象。享元模式可以避免大量相似类的开销,在软件开发中如果需要生成大量细粒度的类实例来表示数据,如果这些实例除了几个参数外基本上都是相同的,这时候就可以使用享元模式来大幅度减少需要实例化类的数量
享元模式的类图
-
抽象享元角色(Flyweight):此角色是所有的具体享元类的基类,为这些类规定出需要实现的公共接口。那些需要外部状态的操作可以通过调用方法以参数形式传入
-
具体享元角色(ConcreteFlyweight):实现抽象享元角色所规定的接口。如果有内部状态的话,可以在类内部定义
-
享元工厂角色(FlyweightFactory):本角色复杂创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享,当一个客户端对象调用一个享元对象的时候,享元工厂角色检查系统中是否已经有一个符合要求的享元对象,如果已经存在,享元工厂角色就提供已存在的享元对象,如果系统中没有一个符合的享元对象的话,享元工厂角色就应当创建一个合适的享元对象
-
客户端角色(Client):本角色需要存储所有享元对象的外部状态
例如Tile保存x, y等特有的变量外还有保存Mesh等可共用的变量
class MeshFactory
{
static map<string, Mesh*> meshs;
public:
static Mesh* getMesh(string key)
{
map<string, Mesh*>::iterator iter = meshs.find(key);
if (iter != meshs.end())
{
return iter->second;
}
Mesh *mesh = new ConcreteMesh(key);
meshs.insert(pair<string, Mesh*>(key, mesh));
return mesh;
}
static int getSum()
{
return meshs.size();
}
};
map<string, Mesh*> MeshFactory::meshs;
享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象
享元模式的优缺点
分析完享元模式的实现之后,让我们继续分析下享元模式的优缺点:
优点:
- 降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力
缺点:
- 为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑更复杂,使系统复杂化
- 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长
总结
到这里,享元模式的介绍就结束了,享元模式主要用来解决由于大量的细粒度对象所造成的内存开销的问题,它在实际的开发中并不常用,可以作为底层的提升性能的一种手段
网友评论