1定义

使用共享对象可有效的支持大量细粒度的对象

2类图

角色分析

Flyweight抽象享元角色,一个产品的抽象,定义内部状态和外部状态的接口或者实现

ConcreteFlyweight具体享元角色,实现抽象角色定义的业务。注:内部状态处理和环境无关

unsharedConcreteFlyweight不可共享的享元角色,不存在外部状态或者安全要求,不能够使用共性技术的对象,该对象一般不会出现在享元工厂中

Flyweight享元工厂,就是构造一个池容器,同时提供从翅中获得对象的方法

3实现

#pragma once
#include<hash_map>
#include<iostream>
using namespace std; class Flyweight
{
private:
//内部状态
string intrinsic;
protected:
//外部状态
const string extrainsic;
public:
Flyweight(string _ex)
:extrainsic ( _ex)
{
} //定义业务操作
virtual void operate(){}
string getIntrinsic()
{
return intrinsic;
}
void setIntrinsic(string _in)
{
intrinsic = _in;
}
}; class ConcreteFlyweight1 :public Flyweight
{
public:
ConcreteFlyweight1(string ex)
:Flyweight(ex)
{} void operate()
{
//根据外部逻辑进行业务处理
cout << "1根据外部逻辑进行业务处理!" << endl;
}
};
class ConcreteFlyweight2 :public Flyweight
{
public:
ConcreteFlyweight2(string ex)
:Flyweight(ex)
{} void operate()
{
//根据外部逻辑进行业务处理
cout << "2根据外部逻辑进行业务处理!" << endl;
}
};
class FlyweightFactory
{
private:
static hash_map<string, Flyweight*> pool;
public:
Flyweight* getFlyweight(string ex)
{
hash_map<string, Flyweight*>::iterator it = pool.find(ex);
if (it == pool.end())
{
cout << "Creat Flyweight1" << endl;
pool[ex] = new ConcreteFlyweight1(ex);
}
return pool[ex];
}
}; hash_map<string, Flyweight*> FlyweightFactory::pool = hash_map<string,Flyweight*>();
class Client
{
public:
void operator()()
{
FlyweightFactory ff;
Flyweight * pf = ff.getFlyweight("lianglihui");
pf->operate();
}
};

4应用

①优点

是一个简单的模式,可以大大减少程序创建的对象,降低内存占用,增强性能

②缺点

提高系统复杂性,需要分离状态,且外部状态不应该随着内部状态的改变而改变

③使用场景

系统中存在大量的相似对象

细粒度的对象都具有较接近的外部状态,而内部状态和环境无关。

需要缓冲池的场景

5扩展

① 线程安全问题,因为共享对象比较少,多个线程同时去访问通过外部状态对其内部状态访问就出现了线程安全问题。--》使用享元模式时,保证享元对象足够多,同时处理掉线程安全问题就好

②性能问题

优化:将外部状态封装成类,通过桥梁模式进行嫁接,减少耦合,提高效率/使用系统内置类型作为外部状态

(ps因为池中检测会有调用消耗)

6对象池vs享元模式

享元模式可以实现对象池

对象池着重在对象的复用,池中的每个对象都是可替换的,从同一个池中获得A对象和B对象对客户端来讲是完全相同的,主要解决复用。

享元模式侧重共享问题,如何建立多个可共享的细粒度对象则是其关注的重点。

设计模式--享元模式C++实现的更多相关文章

  1. 8. 星际争霸之php设计模式--享元模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. C++设计模式——享元模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.如果这篇文章对你有帮助,你可以请我喝杯咖啡. » 本文链接:http:// ...

  3. java设计模式——享元模式

    一. 定义与类型 定义:提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象 类型:结构性 二. 使用场景 (1)  常常应用于系统底层的开发,以便解决系统的性能 ...

  4. 【设计模式】Java设计模式 - 享元模式

    Java设计模式 - 享元模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  5. [工作中的设计模式]享元模式模式FlyWeight

    一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...

  6. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构

  7. 深入浅出设计模式——享元模式(Flyweight Pattern)

    模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...

  8. Java设计模式-享元模式(Flyweight)

    享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...

  9. java设计模式---享元模式

    享元模式 顾名思义:共享元对象.如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象. 享元模式是为数不多的.只为提升系统性能而生的设计模式.它的主要作用就 ...

  10. 结合JDK源码看设计模式——享元模式

    前言 在说享元模式之前,你一定见到过这样的面试题 public class Test { public static void main(String[] args) { Integer a=Inte ...

随机推荐

  1. django 使用form验证用户名和密码

    form验证可以减少查询数据库,所以代码先预先验证,有问题可以返回给前端显示 1.在users文件夹下新建forms.py文件,用来验证用户名和密码是否为空,密码长度是否大于6 # -*- codin ...

  2. mysql忘记密码怎么办?(转)

    linux下mysql忘记密码处理方法: 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码 ...

  3. knockout 学习使用笔记----绑定map--双向绑定

    简单的方式,使用 knockout.mapping.js. 1.引入knockout.mapping.js. 2.声明模型 var model = { task:null, feedbacks:[], ...

  4. WebUploader 上传插件结合bootstrap的模态框使用时选择上传文件按钮无效问题的解决方法

    由于种种原因(工作忙,要锻炼健身,要看书,要学习其他兴趣爱好,谈恋爱等),博客已经好久没有更新,为这个内心一直感觉很愧疚,今天开始决定继续更新博客,每周至少一篇,最多不限篇幅. 今天说一下,下午在工作 ...

  5. maven tomcat7-maven-plugin配置及背景

    背景: 在研发阶段,想让一个服务通过tomcat启动起来有很多的方法,常用的idea都有这样的支持,那么如果我们没有tomcat,能不能让服务通过tomcat启动起来呢?maven就提供了这样的支持. ...

  6. idea构建一个简单的maven_web项目

    软件说明 好啦,开始创建mave的web项目啦!

  7. Array类拓展方法

    var arr=[ {name:'one',sex:'girl',handsome:true}, {name:'two',sex:'girl',handsome:false}, {name:'thr' ...

  8. java容器的数据结构-ArrayList,LinkList,HashMap

    ArrayList: 初始容量为10,底层实现是一个数组,Object[] elementData 自动扩容机制,当添加一个元素时,数组长度超过了elementData.leng,则会按照1.5倍进行 ...

  9. Python基本数据类型之列表

    学习Python的列表类型需要了解和掌握什么是列表.列表的可变性.列表的访问.列表的增删改查等操作~ 1.了解列表 list1 = ['abc', 123, {1, 2, 3},[2,3]] Pyth ...

  10. JAVA基本常识及环境搭建

    JAVA基本常识及环境搭建 常用dos命令行 dir 列出当前目录下的文件以及文件夹 md 创建目录 cd 进入指定目录 cd.. 退回到上一级目录 cd/ 退回到根目录 del 删除文件 删除单个文 ...