java设计模式之享元设计模式
一.构成
单纯享元模式
- 抽象享元角色:定义了公共的接口,所有的具体享元角色需要实现的接口,那些需要外蕴状态的操作可以通过方法的参数传入.
- 具体享元角色:实现抽线享元角色所规定的公共接口,如果有内蕴状态的话必须负责为内蕴状态提供存储空间.享元内蕴状态的属性必须与对象所处的环境无关,也就是说内蕴状态是不可以变化的.从而使得享元对象可以在系统中公用.
- 享元工厂角色:负责创建和管理享元角色,必须保证相同的外蕴状态可以使用同一个享元角色.当一个客户端带者外蕴状态来请求享元角色时,判断该享元角色是否存在,如果有,就直接返回该存在的享元对象,如果没有,就创建一个新的享元对象.
- 客户端角色:需要维护所有享元角色的引用,维护所有的外蕴状态.
复合享元模式
- 抽象享元角色:定义了公共的接口,所有的具体享元角色需要实现的接口,那些需要外蕴状态的操作可以桶盖方法的参数传入.
- 具体享元角色(不同):实现抽线享元角色所规定的公共接口,如果有内蕴状态的话必须负责为内蕴状态提供存储空间.享元内蕴状态的属性必须与对象所处的环境无关,也就是说内蕴状态是不可以变化的.从而使得享元对象可以在系统中公用.
- 复合享元角色:复合享元角色由具体的享元角色构成,它不可以被共享.
- 享元工厂角色(不同):负责创建和管理享元角色,必须保证相同的外蕴状态可以使用同一个享元角色.当一个客户端带者外蕴状态来请求享元角色时,判断该享元角色是否存在,如果有,就直接返回该存在的享元对象,如果没有,就创建一个新的享元对象.
- 客户端角色:需要维护所有享元角色的引用,维护所有具体享元角色的外蕴状态.
二.代码
public class MainTest {public static void main(String[] args) {IPen y1 = PenFactory.createIpen("yel");IPen y2 = PenFactory.createIpen("yel");IPen y3 = PenFactory.createIpen("yel");IPen bule = PenFactory.createIpen("bule");y1.write("语文作业");y2.write("数学作业");y3.write("英语作业");bule.write("语文作业");}
}//抽象的享元角色
interface IPen {void write(String article);
}// 具体的享元角色
class Pen implements IPen {private String color;public Pen(String color) {this.color = color;}@Overridepublic void write(String article) {System.out.println(this.hashCode() + "===" + color + "===" + article);}
}// 享元工厂角色
class PenFactory {private static final Map<String, IPen> map = new HashMap<>();public static IPen createIpen(String color) {IPen iPen = map.get(color);synchronized (color) {if (iPen == null) {iPen = new Pen(color);map.put(color, iPen);}}return iPen;}
}
输出
990368553===yel===数学作业
990368553===yel===英语作业
1096979270===bule===语文作业
public class MainTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("yel");list.add("yel");list.add("red");ListPen listPen = PenFactory.createListPen(list);listPen.write("语文作业");}
}//抽象的享元角色
interface IPen {// 提供外蕴状态void write(String article);
}// 具体的享元角色
class Pen implements IPen {private String color;public Pen(String color) {this.color = color;}@Overridepublic void write(String article) {System.out.println(this.hashCode() + "===" + color + "===" + article);}
}// 享元工厂角色
class PenFactory {private static final Map<String, IPen> map = new HashMap<>();// 创建单纯享元角色public static IPen createIpen(String color) {IPen iPen = map.get(color);synchronized (color) {if (iPen == null) {iPen = new Pen(color);map.put(color, iPen);}}return iPen;}// 创建复合享元角色public static ListPen createListPen(List<String> colors) {ListPen listPen = new ListPen();for (String color : colors){listPen.add(createIpen(color));}return listPen;}
}// 复合享元角色
class ListPen implements IPen{private List<IPen> list = new ArrayList<>();public void add(IPen iPen){list.add(iPen);}@Overridepublic void write(String article) {for (IPen iPen:list){iPen.write(article);}}
}
输出
990368553===yel===语文作业
1096979270===red===语文作业
三.特点
- 解耦,把相同的属性和不同的属性抽取出来,而且对象的创建统一使用工厂来创建对象.
- 提高了内存的使用效率,在内存中创建的对象明显减少,特别是在客户端多次调用的时候,维护的对象大大的减少.
- 使得系统更加复杂,为了使得对象可以共享,需要将一些外部状态抽取出来,这使得程序的逻辑复杂化.
- 对象的外部状态,读取外部的状态使得运行时间稍长.
四.使用场景(满足所有条件)
- 一个应用程序使用了大量的对象.
- 完全由于使用了大量的对象,造成很大的内存开销
- 对象的大多数状态都可以变为外蕴状态
- 如果删除对象的外部状态,那么可以用较少的共享对象取代很多组对象
- 应用程序不依赖对象标识
五.参考文献
java设计模式之享元设计模式相关推荐
- 结构设计模式 - Flyweight设计模式(享元设计模式)
结构设计模式 - Flyweight设计模式 今天我们将研究Flyweight 设计模式,Flyweight设计模式又被称为 享元设计模式 . 目录[ 隐藏 ] 1 Flyweight设计模式 1.1 ...
- Java中的享元设计模式,涨姿势了!
首先来看一段代码: public class ShareTest {public static void main(String[] args) {Integer a = 127;Integer b ...
- 设计模式之——享元设计模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...
- Java设计模式(十八):享元设计模式
1. 应用场景 当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空 ...
- Integer注意_享元设计模式
public class IntegerNote{ public static void main(String[] args){ Integer d1=100; Integer d2=100 ...
- Java设计模式之享元模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式之享元模式
Java设计模式之享元模式 1. 享元模式概述 1.1 享元定义 1.2 享元模式注意事项 2. 享元模式实现 1. 享元模式概述 1.1 享元定义 1)享元模式(享元模式)也叫蝇量模式:利用共享技术 ...
- 设计模式:享元(FlyWeight)模式
设计模式:享元(FlyWeight)模式 一.前言 享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...
- python设计模式之享元模式
一.享元模式定义: 享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思想是通过引入数据共享来提升性能. 在开发3D游戏时,例如有成千上万的士兵或者有成千上万棵树,如果一个3D地带的每 ...
最新文章
- 计算机网络实验二交换机配置Cisco,思科实验1计算机和交换机的ip地址设置
- 《快学 Go 语言》第 5 课 —— 神奇的切片
- oracle full outer join,oracle 内连接(inner join)、外连接(outer join)、全连接(full join)...
- 中石油训练赛 - Faulhaber’s Triangle(打表)
- python 异步 生产者 消费者_python 线程通信 生产者与消费者
- 牛客竞赛mjt的毒瘤赛
- 32岁已育国企技术女,上升无望,下一步如何做?
- 使用EDITPLUS编写C#控制台应用程序
- 驱动精灵w8ndows xp sp2,爱普生Epson TM-U220打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
- 影视剪辑,视频剪辑的万能剪辑技巧来啦,剪辑技巧合集
- C语言 简单的文件下载器
- c语言编程求阶梯数,c语言编程阶梯教程十二
- python虚拟变量回归_虚拟变量提升多元线性回归模型精度(附Python代码与数据)...
- C++使用OLE高速读写EXCEL的源码
- Ibeacon一维小项目
- 企业级360用户画像
- 关于跳跃连接 卷积网络
- GET和POST两种基本请求方法的区别 1
- 商业化广告--体系学习-- 7 -- 行业蓝图篇 --广告产品发展路径
- return的返回用法