JAVA设计模式——享元模式
JAVA设计模式——享元模式
一.主要概念
1.定义
运用共享技术有效地支持大量细粒度对象的复用。在项目中出现很多相同或类似的对象,享元模式会创建一个享元池将这些公共的实例保存在享元池中。可以针对的创建不同的对象,
然后通过复用的方式进行分配。需要的时候就将对应的对象取出,不需要则放回。
1.1 内部状态与外部状态
内部状态:共享的部分属性
外部状态:不能够共享的状态就是外部状态(外部状态由客户端决定)
2.外观模式涉及的角色
1.Flyweight (享元抽象类): 定义了享元类的公共方法。这些方法可以分享内部状态的数据,也可以调用这些方法修改外部状态。
2.ConcreteFlyweight(具体享元类):存储内部状态,存储共享状态的类
3.UnshareConcreteFlyweight(非共享具体享元类): 非共享具体享元类,指一下不需要共享的享元类
4.Flyweight(享元工厂类):用来创建和管理Flyweight
3.享元模式的UML图
二.具体实现
Flyweight (享元抽象类)
// 抽象享元类 里面包含了共享的状态和非共享状态
public interface BottleCap {// 内部状态String getColor();// 外部状态String getCode(String different);
}
ConcreteFlyweight(具体享元类)
/*** 具体享元类,他关注我们的整体,对于共享部分自己处理,对于非共享部分,引入非共享部门负责类*/
public class OkCap implements BottleCap {String color;BottleCap bottleCap;public OkCap(String color,BottleCap bottleCap){this.color = color;this.bottleCap = bottleCap;}@Overridepublic String getColor() {return this.color;}// 享元模式最终想要的对象是一个内部状态+外部状态的完整对象@Overridepublic String getCode(String different) {if (bottleCap != null)return bottleCap.getCode(different);return "无法打印";}
}
UnshareConcreteFlyweight(非共享具体享元类)
// 非共享部门的子类,他关注于我们的非共享部分
public class NoCap implements BottleCap {@Overridepublic String getColor() { // 非共享具体享元类不需要考虑内部状态return null;}/*** 传入different ,是为了客户端调用,也是为了对code进行特异处理* @param different* @return*/@Overridepublic String getCode(String different) {return different + "制作完成";}
}
Flyweight(享元工厂类)
/*** CapFactory 并不是制造工厂,它是提供了一个享元池工厂,用于维护我们的享元池*/
public class CapFactory {private static Map<String,BottleCap> map = new HashMap<>();public static BottleCap getBottleCap(String color,BottleCap bottleCap){if (map.get(color) != null){return map.get(color);}BottleCap okCap = new OkCap(color, bottleCap);map.put(color,okCap);return okCap;}
}
Test类
public class Test {public static void main(String[] args) {//1. 简单享元模式 (不考虑外部状态)BottleCap cap1 = CapFactory.getBottleCap("红色", null);BottleCap cap2 = CapFactory.getBottleCap("绿色", null);BottleCap cap3 = CapFactory.getBottleCap("蓝色", null);System.out.println(cap1.getColor());System.out.println(cap1.getCode("二维码"));BottleCap cap4 = CapFactory.getBottleCap("红色", null); // 共享对象,与cap1指向同一对象//2.享元模式 考虑我们的外部状态System.out.println("========================================");BottleCap cap5 = CapFactory.getBottleCap("www色", new NoCap());System.out.println(cap5.getColor());System.out.println(cap5.getCode("李四的二维码"));}
}
三.总结
1.享有模式的优缺点及使用场景
优点
1.节约系统的开销。保证一个常用的对象只有一个!
2.外部状态不会影响内部状态,可以在不同环境下进行共享哦。
使用场景
1.一个系统有大量细粒度化的对象,占据大量的内存。
2.对象大部分属性可以外部化,并且能将外部的属性放入内部属性中来。
3.使用享元模式需要维护享元池,所以要用那种常用的经常调用的对象可以使用享元模式。
jdk源码位置
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
JAVA设计模式——享元模式相关推荐
- 【设计模式】Java设计模式 - 享元模式
[设计模式]Java设计模式 - 享元模式
- JAVA 设计模式 享元模式
用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...
- java设计模式---享元模式
Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己 对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自己的 ...
- JAVA设计模式--享元模式
目录 一.什么是享元模式 二.享元模式在Java中的典型应用 三.享元模式的结构 单纯享元模式 复合享元模式 四.享元模式应用举例 五.享元模式的适用性 六.享元模式的特点 七.总结 一.什么是享元模 ...
- Java设计模式----------享元模式
1.介绍 享元模式通过尽可能的复用已经存在的对象,从而尽量少的创建新对象,以节约系统的内存和提供系统性能.在享元模式中,对象的属性分为两种,内部状态和外部状态.内部状态指的是对象中不随外部变化的属性, ...
- Python设计模式-享元模式
Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...
- 10-Python与设计模式--享元模式
10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...
- 设计模式--享元模式实现C++
/********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...
- Unity设计模式——享元模式(附代码)
Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...
- 第二十二章 Caché 设计模式 享元模式
文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...
最新文章
- POJ3133(插头dp)
- 使用K-Means对美因河畔法兰克福的社区进行聚类
- java压缩源代码_【免费毕设】JAVA文件压缩与解压缩实践(源代码+论文)
- oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程
- 查询SQLServer的启动时间
- 学习common-upload源码,理解上传原理
- Java 视频生成缩略图教程
- Android Studio - 安装插件GsonFormat
- Project 4:用户画像的建立
- 根据网卡MAC地址查询厂商信息
- 考研必备数学公式大全(数学二)(线性代数篇)
- ELK 日志分析系统
- VirtualBox虚拟机提示内存0x00000000不能为written问题
- C语言编译器之一,GCC编译器
- 学习 C++,关键是要理解概念,而不应过于深究语言的技术细节
- 详谈外部H5页面跳转微信一键关注微信公众号的方案
- 【MM小贴士】特殊采购类型40
- 给所有男人和女人的人生忠告
- GMT中文字体显示配置
- 基于Java web的电动车销售平台 毕业设计-附源码201524
热门文章
- swing 绝对布局 窗口事件 鼠标事件 键盘事件 上传头像流程
- 【计算机网络】“三次握手”通俗解释
- 计算天数 python
- educoder答案pythonnumpy_Educoder 题解
- 【SDX62】useradd: group ‘input‘ does not existERROR: libsystemdq: useradd command did not succeed.
- scrapy下载图片(《精通scrapy网络爬虫》第九章)
- (转)如何使用Xcode的Targets来管理开发和生产版本的构建
- 使用VMware虚拟机搭建Panabit透明网桥环境
- 漳州计算机报名时间2015年,漳州市2015年国民经济和社会发展统计公报
- CodeForces 379A. New Year Candles