[设计模式-结构型]享元模式(Flyweight )
概括
名称 |
Flyweight |
结构 |
|
动机 |
运用共享技术有效地支持大量细粒度的对象。 |
适用性 |
|
解析
形象比喻:
每天给MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight, MM的名字就是提取出来的外部特征。
它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweightfactory负责维护一个对象存储池(FlyweightPool)来存放内部状态的对象。为了调用方便,FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。
优缺点:
1)享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
2)享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。
实例
1.Flyweight
描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
2.ConcreteFlyweight
实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。
ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。
3.UnsharedConcreteFlyweight
并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。
在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
4.FlyweightFactory
创建并管理flyweight对象。
确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。
涉及的文件
Flyweight. java -- 接口
FlyweightImpl.java -- 享元实现类
FlyweightFactory.java -- 享元工厂
TestMain.java
/** * @author oscar999 * @date 2013-7-29* @version V1.0 */
package designptn.flyweight;public interface Flyweight {void action(int arg);
}
/** * @author oscar999 * @date 2013-7-29* @version V1.0 */
package designptn.flyweight;public class FlyweightImpl implements Flyweight {public void action(int arg) {System.out.println("Parameter Value is:" + arg);}
}
/** * @author oscar999 * @date 2013-7-29* @version V1.0 */
package designptn.flyweight;import java.util.HashMap;
import java.util.Map;public class FlyweightFactory {private static Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();public FlyweightFactory(String arg) {flyweights.put(arg, new FlyweightImpl());}public static Flyweight getFlyweight(String key) {if (flyweights.get(key) == null) {flyweights.put(key, new FlyweightImpl());}return flyweights.get(key);}public static int getSize() {return flyweights.size();}
}
/** * @author oscar999 * @date 2014-4-25* @version V1.0 */
package designptn.flyweight;public class TestMain {public static void main(String[] args) {// TODO Auto-generated method stubFlyweight fly1 = FlyweightFactory.getFlyweight("a");fly1.action(1);Flyweight fly2 = FlyweightFactory.getFlyweight("a");System.out.println(fly1 == fly2);Flyweight fly3 = FlyweightFactory.getFlyweight("b");fly3.action(2);Flyweight fly4 = FlyweightFactory.getFlyweight("c");fly4.action(3);Flyweight fly5 = FlyweightFactory.getFlyweight("d");fly5.action(4);System.out.println(FlyweightFactory.getSize());}}
FlyweightFactory.getFlyweight("a") 调用了两次, 只创建了一个Object, 节省了内存空间。
享元模式看上去和单态模式有点类似。
单态是一个Object,
而享元对应的是多个Object
[设计模式-结构型]享元模式(Flyweight )相关推荐
- 设计模式(18):结构型-享元模式(Flyweight)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量
前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...
- 结构型-享元模式-02-实例实现(围棋)
结构型-享元模式-02-实例实现 1. 棋子抽象类(享元抽象类): 2. 白棋子(具体享元类): 3. 黑棋子(具体享元类): 4. 棋子坐标类(外部状态) 5. 享元工厂类 6. 客户端测试 7. ...
- java23设计模式---class10、享元模式(FlyWeight)
文章目录 一.基本介绍 1.定义 2.优点 3.缺点 4.角色 1)抽象享元类 2)具体享元类 3)享元工厂类 4)组合享元类 5.内部状态和外部状态 二.应用情景 1.线程池 2.String 3. ...
- Net设计模式实例之享元模式( Flyweight Pattern)
一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support larg ...
- 《研磨设计模式》chap20 享元模式 Flyweight (4)总结
1. 不共享的外部状态 输入数据为: 张三,人员列表,查看,1 李四,人员列表,查看,1 李四,操作薪资数据,2 " 操作薪资数据"包括"薪资数据,查看",&q ...
- 《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍
1.享元模式的定义 享元:分离出被缓存对象实例中,哪些数据是不变且重复出现的,哪些数据是经常变化的.(内部状态分离出来共享) 对象的内部状态: 不变且重复出现的数据, 对象的外部状态: 变化的数据 运 ...
- 《研磨设计模式》chap20 享元模式 Flyweight (3)重写应用场景
public interface Flyweight {//判断传入的安全实体和权限,是否和享元对象内部状态匹配 public boolean match(String securityEntity, ...
- 《研磨设计模式》chap20 享元模式 Flyweight (1)前奏介绍
场景:分配人员对各种数据表的权限,并验证权限操作. eg. 1. 正常编码(不使用模式) public class TestDB {//用来存放授权数据的值 public static Collect ...
最新文章
- DB2定时清理归档日志脚本
- Java黑皮书课后题第7章:*7.29(游戏:挑选四张牌)编写一个程序,从一副52张牌中选出4张,然后计算它们的和。Ace King Quee Jack分别表示1、13、12和11,显示得到和24的次
- java bean工厂_从零构建轻量级Java Web框架
- 链表删除功能实现演示
- 计算机在气象预测的应用,计算机在地面气象观测中的实际应用
- Python让繁琐工作自动化——chapter18 GUI控制键盘与鼠标
- java中==与equal()的区别
- Xcode更改Build输出路径
- ACL(标准/扩展访问控制列表)
- centos 解压压缩包到指定目录
- CC2652RB1F开发板烧录ZNP的固件
- _WIN32_WINNT not defined
- 如何用 Java 对 PDF 文件进行电子签章
- Abp vnext Web应用程序开发教程 5 —— 授权
- 数字藏品的交易平台有哪些 nft数字藏品
- 史上最全的Android文章精选合集
- 如何使用python-hwinfo获取Linux硬件信息?
- python求勾股定理_python入门学习随记(二)(勾股定理、球体积、利率、移位和进制转换、数字求和)...
- github.io 公共博客
- 动态给div背景图片赋值