享元模式 FlyWeight 结构型 设计模式(十五)
意图
意图解析
考虑下图中的情景,这里面所有的“你”字,到底是不是同样的?
- 是,因为全部都是汉字“你”
- 不是,因为尽管都是汉字“你”,但是他们的字体,颜色,字号,却又明显不同,所以不是同样的
小结
享元工厂
示例代码
package flyweight; public class Color {public String Color;public Color(String color) {this.Color = color;}public String getColor() {return Color;} }
package flyweight; public abstract class Character {public abstract String getValue();public void display(Color color) {System.out.println("字符: " + getValue() + " ,颜色: " + color.getColor());} }
package flyweight; public class ChineseCharacter extends Character {@Overridepublic String getValue() {return "你";} }
package flyweight; import java.util.HashMap; public class CharacterFactory {/*** 单例模式 饿汉式创建*/private static CharacterFactory instance = new CharacterFactory();/*** 使用HashMap管理享元池*/private HashMap<String, Object> hm = new HashMap<>();private CharacterFactory() {Character character = new ChineseCharacter();hm.put("你", character);}/*** 单例全局访问接口获取工厂*/public static CharacterFactory getInstance() {return instance;}/*** 根据key获取池中的对象*/public Character getCharacter(String key) {return (Character) hm.get(key);} }
结构
客户端角色Client
客户端角色维护了对所有享元对象的引用
分类
单纯享元模式
package flyweight.simple; public abstract class FlyWeight { /** * 抽象的业务逻辑方法,接受外部状态作为参数 */ abstract public void operation(String outerState); }
package flyweight.simple; public class ConcreteFlyWeight extends FlyWeight {private String innerState = null; public ConcreteFlyWeight(String innerState) {this.innerState = innerState;} /*** 外部状态作为参数传递*/@Overridepublic void operation(String outerState) {System.out.println("innerState = " + innerState + " outerState = " + outerState);} }
package flyweight.simple; import java.util.HashMap; public class FlyWeightFactory {/*** 单例模式 饿汉式创建*/private static FlyWeightFactory instance = new FlyWeightFactory();/*** 使用HashMap管理享元池*/private HashMap<String, Object> hm = new HashMap<>();private FlyWeightFactory() {}/*** 单例全局访问接口获取工厂*/public static FlyWeightFactory getInstance() {return instance;}/*** 根据innerState获取池中的对象* 存在返回,不存在创建并返回*/public FlyWeight getFylWeight(String innerState) {if(hm.containsKey(innerState)){return (FlyWeight) hm.get(innerState);}else{FlyWeight flyWeight = new ConcreteFlyWeight(innerState);hm.put(innerState,flyWeight);return flyWeight;}} }
package flyweight.simple; public class Test { public static void main(String[] args){ FlyWeightFactory flyWeightFactory = FlyWeightFactory.getInstance(); FlyWeight flyWeight1 = flyWeightFactory.getFylWeight("First"); FlyWeight flyWeight2 = flyWeightFactory.getFylWeight("Second"); FlyWeight flyWeight3 = flyWeightFactory.getFylWeight("First");System.out.println(flyWeight1); System.out.println(flyWeight2); System.out.println(flyWeight3); System.out.println();flyWeight1.operation("outer state XXX"); flyWeight2.operation("outer state YYY"); flyWeight3.operation("outer state ZZZ"); } }
复合享元模式
复合享元角色UnsharedConcreteFlyWeight
复合享元角色,也就是不可共享的,也被称为 不可共享的享元对象
但是一个复合享元对象可以分解为多个本身是单纯享元对象的组合
这些单纯的享元对象就又是可以共享的
package flyweight.composite; public abstract class FlyWeight { /** * 抽象的业务逻辑方法,接受外部状态作为参数 */ abstract public void operation(String outerState); }
package flyweight.composite; public class ConcreteFlyWeight extends FlyWeight { private String innerState = null; public ConcreteFlyWeight(String innerState) { this.innerState = innerState; } /** * 外部状态作为参数传递 */ @Override public void operation(String outerState) { System.out.println("innerState = " + innerState + " outerState = " + outerState); } }
package flyweight.composite; import java.util.ArrayList; import java.util.List; public class UnsharedConcreateFlyWeight extends FlyWeight { private String innerState = null; public UnsharedConcreateFlyWeight(String innerState) { this.innerState = innerState; }private List<FlyWeight> list = new ArrayList<>(); public void add(FlyWeight flyWeight) { list.add(flyWeight); } @Override public void operation(String outerState) { for (FlyWeight flyWeight:list) { flyWeight.operation(outerState);} } }
package flyweight.composite;import java.util.HashMap;public class FlyWeightFactory {/*** 单例模式 饿汉式创建*/private static FlyWeightFactory instance = new FlyWeightFactory();/*** 使用HashMap管理享元池*/private HashMap<String, Object> hm = new HashMap<>();/*** 管理复合享元对象*/private HashMap<String, Object> compositeHm = new HashMap<>();private FlyWeightFactory() {}/*** 单例全局访问接口获取工厂*/public static FlyWeightFactory getInstance() {return instance;}/*** 根据innerState获取池中的对象* 存在返回,不存在创建并返回*/public FlyWeight getFylWeight(String innerState) {if(hm.containsKey(innerState)){return (FlyWeight) hm.get(innerState);}else{FlyWeight flyWeight = new ConcreteFlyWeight(innerState);hm.put(innerState,flyWeight);return flyWeight;}}/*** 根据innerState获取池中的对象* 存在返回,不存在创建并返回*/public UnsharedConcreateFlyWeight getCompositeFylWeight(String state) {if(compositeHm.containsKey(state)){return (UnsharedConcreateFlyWeight) compositeHm.get(state);}else{UnsharedConcreateFlyWeight flyWeight = new UnsharedConcreateFlyWeight(state);compositeHm.put(state,flyWeight);return flyWeight;}}}
package flyweight.composite; public class Test { public static void main(String[] args){FlyWeightFactory flyWeightFactory = FlyWeightFactory.getInstance();FlyWeight flyWeight1 = flyWeightFactory.getFylWeight("First");FlyWeight flyWeight2 = flyWeightFactory.getFylWeight("Second");FlyWeight flyWeight3 = flyWeightFactory.getFylWeight("First");System.out.println(flyWeight1);System.out.println(flyWeight2);System.out.println(flyWeight3);System.out.println("###########################################");flyWeight1.operation("outer state XXX");flyWeight2.operation("outer state YYY");flyWeight3.operation("outer state ZZZ");System.out.println("###########################################");UnsharedConcreateFlyWeight compositeFlyWeight = flyWeightFactory.getCompositeFylWeight("composite");compositeFlyWeight.add(flyWeight1);compositeFlyWeight.add(flyWeight2);compositeFlyWeight.operation("composite out state OOO");} }
使用场景
- 应用程序中使用了大量的对象
- 大量的对象明显增加了程序的存储运行开销
- 对象可以提取出内部状态,并且可以分离外部状态
总结
享元模式 FlyWeight 结构型 设计模式(十五)相关推荐
- 享元模式(结构型模式)
7.享元模式 享元模式(Flyweight Pattern)运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量.避免大量相似对象的开销,从而提高系 ...
- java设计模式之——外观模式、组合模式、装饰模式、享元模式(结构型)
一.外观模式 定义:为子系统中一组接口提供一致的界面,此模式定义了一个高层接口,该接口使得子系统更加容易使用. 使用场景:一.在软件设计初级阶段,应该有意识的将软件两个层分开,比如经典的三层架构,降低 ...
- 设计模式(十)享元模式Flyweight(结构型)
设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...
- 设计模式(18):结构型-享元模式(Flyweight)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- Flyweight(享元)--对象结构型模式
Flyweight(享元)–对象结构型模式 一.意图 运行共享技术有效地支持大量细粒度的对象. 二.动机 1.在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行 ...
- 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量
前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...
- java23设计模式---class10、享元模式(FlyWeight)
文章目录 一.基本介绍 1.定义 2.优点 3.缺点 4.角色 1)抽象享元类 2)具体享元类 3)享元工厂类 4)组合享元类 5.内部状态和外部状态 二.应用情景 1.线程池 2.String 3. ...
- c++享元模式flyweight
c++享元模式flyweight 概念 角色和职责 抽象享元角色 享元工厂角色 使用场景 案例 概念 Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用. ...
- 享元模式-Flyweight(Java实现)
享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...
最新文章
- java人名识别_HanLP中人名识别分析(示例代码)
- 斯坦福机器学习公开课学习笔记(1)—机器学习的动机与应用
- 机器学习大佬的进阶之路!一位北大硕士毕业梳理了完整的学习路线!
- uva 10723 Cyborg Genes
- python进程监控及恢复
- 模拟航班查询及预定系统 编写示例
- 程序员解决20年前的加密问题
- php oracle 操作 sql语句中能不能添加数组_如何在PHP中使用Oracle数据库_php
- AWS EC2怎么动态增加磁盘空间
- 在线最小公倍数计算器
- python sybase安装
- 东北三省计算机专业好的学校,东北地区哪个大学比较好 各自的王牌专业是什么...
- 【渝粤教育】国家开放大学2018年春季 0281-22T色装概论 参考试题
- 计算机怎么改鼠标标志,图文帮你如何自定义电脑鼠标指针的图标
- 硕思闪客精灵v2021如何用Flash制作动画短片流程分享
- 移动端设备广告投放的用户唯一识别码
- 计算机开机桌面黑,电脑开机后桌面自动变成黑色的
- 测试中的Right-BICEP
- 压缩文件密码破解神器rarcrack
- dram sram drom srom ddram详细解释
热门文章
- 苹果电脑右键怎么按_天正CAD右键菜单怎么改为CAD默认右键菜单?
- 服务器信息采集协议,服务器信息采集
- h3c交换机限制端口访问_H3C交换机端口限速和流量监管典型配置指导
- dataframe iloc_DataFrame
- 公司--页面调用日期控件 WdatePicker日历控件使用方法
- js中 replace(/\//g, '') 什么作用. 正则表达式
- bfgs算法matlab程序,BFGS优化算法及应用实例.docx
- 5 select 选择的值_表单元素之选择类型
- 程序计算机限制无法打开,由于一个软件限制策略的阻止,windows无法打开此程序...解决方案参考...
- java ucs2转utf8_UCS-2和UTF-8的互相转换