享元模式/Flyweight模式/对象结构型/设计模式
flyweight 享元模式(对象结构型)
Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。
意图
运用共享技术有效地支持大量细粒度的对象。关键字:对象共享
动机
Flyweight模式描述了如何共享对象,降低内存消耗和运行开销。Flyweight是一个共享对象,对象有内部状态和外部状态。
内部状态存于享元中,包含独立于场景的信息;
外部状态取决于场景,非共享。
适用场景
- 程序适用了大量对象,并造成了很大的存储开销
- 对象的大多数状态都可以变为外部状态
- 删除外部状态后,可以用相对较少的共享对象取代原对象们
享元模式要素 享元接口+享元+享元工厂
- Flyweight接口,规定享元需要实现的方法,外部状态,可变部分
- ConcreteFlyweight,具体享元对象,为内部状态提供存储空间,实现享元接口,为外部状态提供入口
- FlyweightFactory,享元工厂,创建和管理具体享元角色。
简单享元模式代码
interface Flyweight{
void fly(Object externalState);
}
class ConcreteFlyweight implements Flyweight{
private Object innerState=null;
//内部状态存储
public ConcreteFlyweight(Object innerState){
this.innerState = innerState;
}
//外部状态,改变行为
@Override
public void fly(Object externalState) {
// do sth
}
}
class FlyweightFactory {
private Map<Object,Flyweight> files = new HashMap<Object,Flyweight>();
public Flyweight factory(Object state){
//从工厂中取出缓存的享元,不存在则创建,并放入缓存
Flyweight fly = files.get(state);
if(fly == null){
fly = new ConcreteFlyweight(state);
files.put(state, fly);
}
return fly;
}
}
组合式的享元模式
将单独可共享的具体享元对象,进行各种组合,并提供访问接口。
interface Flyweight{
void fly(Object externalState);
}
class ConcreteFlyweight implements Flyweight{
private Object innerState=null;
public ConcreteFlyweight(Object innerState){
this.innerState = innerState;
}
@Override
public void fly(Object externalState) {
// do sth
}
}
//组合享元,提供一组享元的组合,并提供享元接口
class CompositeConcreteFlyweight implements Flyweight{
private List<Flyweight> flyweights=new ArrayList<>();
//组合享元组,添加单享元
public void add(Flyweight flyweight){
flyweights.add(flyweight);
}
//享元组,外边状态接口方法
@Override
public void fly(Object externalState) {
for (Flyweight flyweight : flyweights) {
flyweight.fly(externalState);
}
}
}
//享元工厂,提供组合享元和单独享元的获取方法
class FlyweightFactory {
private Map<Object,Flyweight> files = new HashMap<Object,Flyweight>();
//获取享元组
public Flyweight factory(List<Object> compositeState){
CompositeConcreteFlyweight compositeFly = new CompositeConcreteFlyweight();
for(Object state : compositeState){
compositeFly.add(factory(state));
}
return compositeFly;
}
//获取单享元
public Flyweight factory(Object state){
Flyweight fly = files.get(state);
if(fly == null){
fly = new ConcreteFlyweight(state);
files.put(state, fly);
}
return fly;
}
}
经典应用
文档编辑器,每个字符,都是一个享元对象,这使得文档编辑器运行很快。
还有就是JDK中的String对象,相同的字符串,地址相当(可以用==判断),所以每个字符串都是常量,并且是享元。
参考
《设计模式》
相关博客
享元模式/Flyweight模式/对象结构型/设计模式的更多相关文章
- OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
前言 前面我们学习了创建型设计模式,其中有5中,个人感觉比较重要的是工厂方法模式.单例模式.原型模式.接下来我将分享的是结构型模式! 一.适配器模式 1.1.适配器模式概述 适配器模式(Adapter ...
- 享元模式 FlyWeight 结构型 设计模式(十五)
享元模式(FlyWeight) “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...
- 设计模式的征途—12.享元(Flyweight)模式
现在在大力推行节约型社会,“浪费可耻,节俭光荣”.在软件系统中,有时候也会存在资源浪费的情况,例如,在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致系统运行代价过高.那 ...
- 设计模式之享元(flyweight)模式
现在在大力推行节约型社会,“浪费可耻,节俭光荣”.在软件系统中,有时候也会存在资源浪费的情况,例如,在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致系统运行代价过高.那 ...
- 设计模式:享元(FlyWeight)模式
设计模式:享元(FlyWeight)模式 一.前言 享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...
- 享元(Flyweight)模式
享元(Flyweight)模式:运用共享技术有效的支持大量细粒度的对象. /* * 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口. 那些需要外蕴 ...
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- 代理模式 PROXY Surrogate 结构型 设计模式(十四)
代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...
- 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
桥接模式Bridge Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来 意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展. 意图解析 依赖倒置原 ...
随机推荐
- jsp中iframe填充装个页面
首先要引入这个css,由于我之前没有引入这个,导致iframe的高度一只是默认高度,没有改变 <style type="text/css"> body, html { ...
- SpringBoot源码解析:AOP思想以及相应的应用
spring中拦截器和过滤器都是基于AOP思想实现的,过滤器只作用于servlet,表现在请求的前后过程中:拦截器属于spring的一个组件,由spring管理, 可以作用于spring任何资源,对象 ...
- Samba服务配置简明笔记
内部服务器之间拷贝数据,用root账号访问,没有做更复杂的设置. 1.用YUM安装samba服务器端及客户端: [root@tenjs05 init.d]# yum install samba sam ...
- 【原】常用的javascript设计模式
设计模式太多了,貌似有23种,其实我们在平时的工作中没有必要特意去用什么样的设计模式,或者你在不经意间就已经用了设计模式当中的一种.本文旨在总结平时相对来说用的比较多的设计模式. 什么是设计模式 百度 ...
- jQuery animate动画 stop()方法详解~
一.动画格式: 格式一:jQueryObject.animate( cssProperties, options ) 格式二:$('#id').animate( styles[, duration ] ...
- 【转】PHOTOSHOP常用快捷键大全
PHOTOSHOP常用快捷键大全 一.文件新建 CTRL+N打开 CTRL+O 打开为 ALT+CTRL+O关闭 CTRL+W保存 CTRL+S 另存为 CTRL+SHIFT+S另存为网页格式 CTR ...
- Python SMTP邮件模块
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...
- [nginx学习之道]linux的nginx安装
准备:首先要安装下一些gcc库用于编译 和一些nginx的扩展lib包: [root@localhost nginx-]# yum -y install gcc gcc-c++ autoconf au ...
- 2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等
1.字符串去重,html模板取值 2.javascript正则表达式之$1...$9 3.jquery插件 4.返回上一页并刷新 解决方法: <a href ="javas ...
- 【相当实用】如何让TortoiseSVN导出新增或修改过的文件
当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他没有修改过的文件就没有必要上载到服务器.但一个稍微上规模的网站 ...