享元模式/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 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来 意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展. 意图解析 依赖倒置原 ...
随机推荐
- 前端模块化工具-webpack
详解前端模块化工具-webpack webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不 ...
- git 代码更新
第一:先说首次使用 意思就是这个文件夹中的代码你还没有向GITHUB提交过代码 cd /home/test(假如 test就是你的用户名)/githubtest(这是个文件夹,你可以提前先建立好,这个 ...
- 100 个 Linux 常用命令大全
1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件 -A 通-a,但不列出"."和".." -l 列出 ...
- TeamViewer12.0.71503(远程控制软件)精简版 单文件企业版介绍
TeamViewer 是一款能在任何防火墙和 NAT 代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamViewer 即可 ...
- Redis中持久化的两种方法详解
Redis提供了两种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里;另一种方法教只追加文件(append-only f ...
- mate标签
<meta charset='utf-8'> <!-- 优先使用 IE 最新版本和 Chrome --> <meta http-equiv="X-UA-C ...
- Linux lsof命令 以及 恢复删除的文件
1.简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传 ...
- CSS选择器优先级总结
CSS三大特性-- 继承. 优先级和层叠. 继承:即子类元素继承父类的样式; 优先级:是指不同类别样式的权重比较; 层叠:是说当数量相同时,通过层叠(后者覆盖前者)的样式. css选择符分类 首先来看 ...
- JAVA中获取当前系统时间及格式转换
JAVA中获取当前系统时间 一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; publi ...
- entiryFramework 事务控制
1.在项目中添加System.Transactions命名空间 2.在代码中编写如下代码段: using (var trans = new TransactionScope()) { EF的代码 tr ...