享元模式(Flyweight)
:运用共享技术有效地支持大量细粒度的对象。
- FlyweightFactory:一个享元工厂,且来创建并管理Flyweight对象,它主要是用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个己创建的实例或者创建一个(如果不存在的话)
- UnsharedConcreteFlyweight:用来解决那些不需要共享对象的问题。
内部状态与外部状态
在序设计中,有时需要生成大量的细粒度的类实例来表示数据。可以将实例中的相同部分外的几个参数提取出,移到类实例的外面,在方法调用时将它传递进来,就可以通过共享大幅度地减少单个实例的数目。
内部状态存储ConcreteFlyweight对象中,外部状态考虑由客户端对象存储或者计算。
享元模式的应用
如果一个应用程序使用的大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
享元模式需要维护一个记录了系统已有的所有享元的列表,同样耗费资源,同时享元模式也会使系统复杂化,会将些状态外部化,使得程序的逻辑变复杂,所以应当在有足够多的实例可供共享时才值得使用共享模式。
#include <iostream>
#include <FlyweightFactory.h>
#include <Flyweight.h>
#include <UnsharedConcreteFlyweight.h>
using namespace std;
int main()
{
int extrinsicstate = 22; //代码外部状态
FlyweightFactory *f = new FlyweightFactory();
Flyweight *fx = f->GetFlyweight("X");
fx->Operation(--extrinsicstate);
Flyweight *fx1 = f->GetFlyweight("X"); //共享上方生成的对象,不再实例化
fx1->Operation(--extrinsicstate);
Flyweight *fy = f->GetFlyweight("Y");
fy->Operation(--extrinsicstate);
Flyweight *fz = f->GetFlyweight("Z");
fz->Operation(--extrinsicstate);
Flyweight *uf = new UnsharedConcreteFlyweight();
uf->Operation(--extrinsicstate);
getchar();
}