享元模式/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 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来 意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展. 意图解析 依赖倒置原 ...
随机推荐
- Codeforces Round #373 (Div. 2)
A,B,C傻逼题,就不说了. E题: #include <iostream> #include <cstdio> #include <cstring> #inclu ...
- js 时间戳转换成几分钟前,几小时前,几天前
formatMsgTime (timespan) { var dateTime = new Date(timespan); var year = dateTime.getFullYear(); var ...
- python 批量扫描mongodb 未授权访问脚本
需要 pymongo库easy_install pymongo脚本: import socket import sys import pymongo ipcons = [] def Scanner(i ...
- Bzoj1597 [Usaco2008 Mar]土地购买
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4005 Solved: 1460 Description 农夫John准备扩大他的农场,他正在考虑N ...
- BZOJ3747: [POI2015]Kinoman
传送门 线段树经典运用. 设$last_i$表示上一个与$i$相同的类型.然后每次更新$[last[i]+1,i]$和$[last[last[i]]+1,last[i]]$的答案就行了. //BZOJ ...
- 出现could not find developer disk image解决办法和不受信任的开发者
真机测试问题 最近一直遇到这样的问题,很是让人心烦,但是还是要自己解决的,我也是从网上查了很多这样的解决办法,都没有成功,所以今天我要把自己的总结的方法和大家分享一下. iOS测试当中的问题 iOS ...
- Python学习笔记——元组
1.创建一个元组并给它赋值 >>> aTuple = (123,'abc',4.56,['inner','tuple'],7-9j) >>> aTuple (123 ...
- ecshop 后台分页功能
Ecshop分页规则,分以下几个步骤 1.点击类别,获取第一页获取默认分类列表数据 2.点击“下一页”,采用ajax调取分页内容 实例分析(比如订单列表分页admin/order.php) 1.先写一 ...
- 安装MariaDB和简单配置
1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB systemctl start maria ...
- 线程安全的无锁RingBuffer的实现
这里的线程安全,是指一个读线程和一个写线程,读写两个线程是安全的,而不是说多个读线程和多个写线程是安全的.. 在程序设计中,我们有时会遇到这样的情况,一个线程将数据写到一个buffer中,另外一个线程 ...