C++设计模式浅识享元模式
来源:互联网 发布:mac怎么删除abc输入法 编辑:程序博客网 时间:2024/06/01 20:26
享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
四个角色类:
- Flyweight享元类:所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。
- Flyweight享元工厂类:一个享元工厂,用来创建并管理Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。
- ConcreteFlyweight具体享元类:继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间。
- UnSharedConcreteFlyweight不需共享的具体Flyweight子类、指那些不需要共享的Flyweight子类。因为Flyweight接口类共享成为可能,但并不强制共享。
模式实现:
//享元类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<std::string, Flyweight*> flyweights;public: FlyweightFactory(){ flyweights["X"] = new ConcreteFlyweight; flyweights["Y"] = new ConcreteFlyweight; flyweights["Z"] = new ConcreteFlyweight; } Flyweight* GetFlyweight(std::string key){ return (Flyweight*)flyweights[key]; }};
客户端:
//Clientint 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;}
享元模式好处:
- 如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用。
- 对象的大多数状态可以使用外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
0 0
- 设计模式----工厂模式(c++)
- 【设计模式C++】工厂模式
- C++/设计模式
- 设计模式[C++]
- C和设计模式
- C语言-设计模式
- C语言-设计模式
- C语言-设计模式
- Object-C 设计模式
- 设计模式(C++)
- C语言设计模式
- C语言-设计模式
- Objective-c:设计模式
- 设计模式C C++
- c语言设计模式
- C设计模式
- 设计模式(C++)
- 设计模式--观察者模式(C++)
- MYSQL-----数据库的操作及存储引擎的选择
- Sql Server之旅——第七站 为什么都说状态少的字段不能建索引
- 列表状态自动切换
- Problem C: 小数计算——结构体
- Sql Server之旅——第八站 复合索引和include索引到底有多大区别?
- C++设计模式浅识享元模式
- C语言基础 printf将一个十六进制按照十进制输出
- Sql Server之旅——第九站 看公司这些DBA们设计的这些复合索引
- Problem D: 分数减法——结构体
- 遗传算法
- 树形结构转换为json类型的字符串
- Swift - 分段选择控件(UISegmentedControl)的用法
- Service层事务不能回滚的解决方式
- Sql Server之旅——第十站 看看DML操作对索引的影响