享元模式/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 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来 意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展. 意图解析 依赖倒置原 ...
随机推荐
- Thinking in java学习笔记之interface
(完全解耦)策略设计模式:
- C语言常见类型占用字节数
前言 最近笔试经常遇到c语言各类型变量所占字节数的问题,这里做一个总结好了. 类型 常见的有char.int.long.short.float.double及指针等. 字符类型 这里单只char,ch ...
- CIDR详解和ip最长地址前缀匹配
1.CIDR是什么 无类域间路由(CIDR)编址方案 摒弃传统的基于类的地址分配方式,允许使用任意长度的地址前缀,有效提高地址空间的利用率. 就是一个ip加一个网络掩码,不过这个掩码不是之前只有3个值 ...
- 解决Spring MVC @ResponseBody返回中文字符串乱码问题
spring mvc使用的默认处理字符串编码为ISO-8859-1 解决方法: 第一种方法: 对于需要返回字符串的方法添加注解,如下: @RequestMapping(value="/use ...
- Linux(Centos6.5)用户名密码
用户列表文件:/etc/passwd用户组列表文件:/etc/group 查看系统中有哪些用户:cut -d : -f 1 /etc/passwd查看可以登录系统的用户:cat /etc/passwd ...
- Linux文件类型及如何查看,修改文件读写权限
现在使用 ls -l 命令,查看详细信息格式的文件列表,您将会看到如下内容: total 5drwxr-x--- 4 user group 4096 Mar 10 00:37 filenamed ...
- CSS3实现加载中效果
代码: <!doctype html> <html> <head> <meta charset="utf-8" /> <tit ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- getCanonicalName和getSimpleName getName的区别与应用
接口: package com.test; public interface Fruit { } 一个实现类: package com.test; public class Apple impleme ...
- 深入理解javascript原型和闭包(1)——一切都是对象
“一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeo ...