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设计模式——享元模式相关推荐

  1. 【设计模式】Java设计模式 - 享元模式

    [设计模式]Java设计模式 - 享元模式

  2. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...

  3. java设计模式---享元模式

    Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己 对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自己的 ...

  4. JAVA设计模式--享元模式

    目录 一.什么是享元模式 二.享元模式在Java中的典型应用 三.享元模式的结构 单纯享元模式 复合享元模式 四.享元模式应用举例 五.享元模式的适用性 六.享元模式的特点 七.总结 一.什么是享元模 ...

  5. Java设计模式----------享元模式

    1.介绍 享元模式通过尽可能的复用已经存在的对象,从而尽量少的创建新对象,以节约系统的内存和提供系统性能.在享元模式中,对象的属性分为两种,内部状态和外部状态.内部状态指的是对象中不随外部变化的属性, ...

  6. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  7. 10-Python与设计模式--享元模式

    10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...

  8. 设计模式--享元模式实现C++

    /********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...

  9. Unity设计模式——享元模式(附代码)

    Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...

  10. 第二十二章 Caché 设计模式 享元模式

    文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...

最新文章

  1. POJ3133(插头dp)
  2. 使用K-Means对美因河畔法兰克福的社区进行聚类
  3. java压缩源代码_【免费毕设】JAVA文件压缩与解压缩实践(源代码+论文)
  4. oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程
  5. 查询SQLServer的启动时间
  6. 学习common-upload源码,理解上传原理
  7. Java 视频生成缩略图教程
  8. Android Studio - 安装插件GsonFormat
  9. Project 4:用户画像的建立
  10. 根据网卡MAC地址查询厂商信息
  11. 考研必备数学公式大全(数学二)(线性代数篇)
  12. ELK 日志分析系统
  13. VirtualBox虚拟机提示内存0x00000000不能为written问题
  14. C语言编译器之一,GCC编译器
  15. 学习 C++,关键是要理解概念,而不应过于深究语言的技术细节
  16. 详谈外部H5页面跳转微信一键关注微信公众号的方案
  17. 【MM小贴士】特殊采购类型40
  18. 给所有男人和女人的人生忠告
  19. GMT中文字体显示配置
  20. 基于Java web的电动车销售平台 毕业设计-附源码201524

热门文章

  1. swing 绝对布局 窗口事件 鼠标事件 键盘事件 上传头像流程
  2. 【计算机网络】“三次握手”通俗解释
  3. 计算天数 python
  4. educoder答案pythonnumpy_Educoder 题解
  5. 【SDX62】useradd: group ‘input‘ does not existERROR: libsystemdq: useradd command did not succeed.
  6. scrapy下载图片(《精通scrapy网络爬虫》第九章)
  7. (转)如何使用Xcode的Targets来管理开发和生产版本的构建
  8. 使用VMware虚拟机搭建Panabit透明网桥环境
  9. 漳州计算机报名时间2015年,漳州市2015年国民经济和社会发展统计公报
  10. CodeForces 379A. New Year Candles