享元模式(flyweight):运用共享技术有效地支持大量细粒度的对象。
四个角色类:
flyweight享元类:所有具体享元类的超类或接口,通过这个接口,flyweight可以接受并作用于外部状态。
flyweight享元工厂类:一个享元工厂,用来创建并管理flyweight,当用户请求一个flyweight时,flyweightfactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。
concreteflyweight具体享元类:继承flyweight超类或实现flyweight接口,并为内部状态增加存储空间。
unsharedconcreteflyweight不需共享的具体flyweight子类、指那些不需要共享的flyweight子类。因为flyweight接口类共享成为可能,但并不强制共享。
模式实现:
[code]//享元类
class Flyweight{
public:
virtual void Operation(int extrinsicState){}
};
//具体享元类
class ConcreteFlyweight: public Flyweight{
public:
virtual void Operation(int extrinsicState)override{
std::cout << "ConcreteFlyweight: " << extrinsicState << std::endl;
}
};
//不需共享的Flyweight子类
class UnSharedConcreteFlyweight: public Flyweight{
public:
virtual void Operation(int extrinsicState){
std::cout << "UnSharedConcreteFlyweight: " << extrinsicState << std::endl;
}
};
//享元工厂,用来创建并管理Flyweight对象
class FlyweightFactory{
private:
std::map flyweights;
public:
FlyweightFactory(){
flyweights["X"] = new ConcreteFlyweight;
flyweights["Y"] = new ConcreteFlyweight;
flyweights["Z"] = new ConcreteFlyweight;
}
Flyweight* GetFlyweight(std::string key){
return (Flyweight*)flyweights[key];
}
}; 客户端:
[code]//Client
int main(){
//外部状态
int extrinsicState = 22;
//工厂
FlyweightFactory *f = new FlyweightFactory;
Flyweight* fx = f->GetFlyweight("X");
fx->Operation(--extrinsicState); //Output: ConcreteFlyweight: 21
Flyweight* fy = f->GetFlyweight("Y");
fy->Operation(--extrinsicState); //Output: ConcreteFlyweight: 20
Flyweight* fz = f->GetFlyweight("Z");
fz->Operation(--extrinsicState); //Output: ConcreteFlyweight: 19
Flyweight *uf = new UnSharedConcreteFlyweight; //Output: UnSharedConcreteFlyweight: 18
uf->Operation(--extrinsicState);
return 0;
}享元模式好处:
如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用。
对象的大多数状态可以使用外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
HTShop网上购物系统由恒天网络科技有限公司根据国际先进技术和国内商务特点自主版权开发的一款具有强大功能的B2C电子商务网上购物平台。HTShop以国际上通用流行的B/S(浏览器/服务器)模式进行设计,采用微软公司的ASP.NET(C#)技术构建而成。 2007-11-10 HTShop CS 通用标准版 v1.1.11.10 更新内容自由更换模版功能开放 修改了购买多款商品,会员中心订单只显示
以上就是C++设计模式浅识享元模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!










