享元模式

定义:

运用共享技术有效地支持大量细粒度的对象。系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量。

模式结构:

Flyweight: 抽象享元类,所有具体享元类的超类或者接口,通过这个接口,Flyweight 可以接受并作用于外部专题。

ConcreteFlyweight: 具体享元类。指定内部状态,为内部状态增加存储空间。

UnsharedConcreteFlyweight: 非共享具体享元类。指出那些不需要共享的Flyweight子类。

FlyweightFactory: 享元工厂类,用来创建并管理Flyweight对象,它主要用来确保合理地共享Flyweight。

应用场景:

享元模式的核心是享元工厂类,享元工厂类维护了一个对象存储池,当客户端需要对象时,首先从享元池中获取,如果享元池中存在对象实例则直接返回,如果享元池中不存在,则创建一个新的享元对象实例返回给用户,并在享元池中保存该新增对象,这点有些单例的意思。

工厂类通常会使用集合类型来保存对象,如 HashMap、Hashtable、Vector 等等,在 Java 中,数据库连接池、线程池等都是用享元模式的应用。

代码示例:

我们以蚂蚁森林种树为例,每个种类的树都是共享的。

定义好树的信息

class Tree {private final String name;private final String color;private final Integer age;Tree(String name, String color, Integer age) {this.name = name;this.color = color;this.age = age;}public String getName() {return name;}public String getColor() {return color;}public Integer getAge() {return age;}
}

需要在哪个坐标上种树

class TreeNode {private Integer x;private Integer y;private Tree tree;TreeNode() {}TreeNode(Integer x, Integer y, Tree tree) {this.x = x;this.y = y;this.tree = tree;}public void plantTrees(){System.out.println("在蚂蚁森林("+x+","+y+")种了一棵"+tree.getAge()+"岁"+tree.getColor()+"的"+tree.getName());}public Integer getX() {return x;}public void setX(Integer x) {this.x = x;}public Integer getY() {return y;}public void setY(Integer y) {this.y = y;}public Tree getTree() {return tree;}public void setTree(Tree tree) {this.tree = tree;}
}

提供一个树工厂。在这里定义了一个ConcurrentHashMap 用来存储各个对象,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;class TreeFactory {private static Map<String,Tree> treeMap = new ConcurrentHashMap<String,Tree>(16);public static Tree getTree(String name,String color,Integer age){if(treeMap.containsKey(name)){return treeMap.get(name);}Tree tree = new Tree(name, color, age);treeMap.put(name,tree);return tree;}}

可以种树啦!客户端的使用

public class Flyweight {public static void main(String[] args) {new TreeNode(5,10,TreeFactory.getTree("俊俊树","绿色",2)).plantTrees();new TreeNode(10,20,TreeFactory.getTree("俊俊树","绿色",1)).plantTrees();new TreeNode(46,80,TreeFactory.getTree("胡杨","绿色",5)).plantTrees();new TreeNode(3,56,TreeFactory.getTree("红柳","红色",1)).plantTrees();}}

运行效果:

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. flowJS源码个人分析
  2. IAR建立stm32工程
  3. Apache ZooKeeper - 构建ZooKeeper源码环境及StandAlone模式下的服务端和客户端启动
  4. 11 Python - dict
  5. 全连接条件随机场_CRF条件随机场
  6. Delta3d角色注册机制
  7. 操作系统之文件管理:7、文件的系统层次
  8. 使用栈将递归函数转化为非递归函数_栈(Stack)及其应用-Python实现
  9. sql用户名数据迁移到mysql_如何将SQL Server数据迁移到MySQL
  10. 5个导致主线程卡顿较鲜为人知的元凶
  11. C 线程同步的四种方式(Windows)
  12. 数据库学习--数据库基本概念
  13. 基于ESP32制作流光溢彩氛围灯
  14. linux 谷歌浏览器设置代理_Linux系统下Firefox浏览器SSH代理服务器脚本及设置方法...
  15. Codeforces Round #469 (Div. 2) C. Zebras
  16. “找不到服务器ip地址”已解决,原因是DNS配置问题。
  17. 干货 | 产品经理如何画脑图
  18. Python基础笔记——函数
  19. mysql如何查询成绩前5名_sql 语句查询 前5名后5名的成绩
  20. IOS 10 推送

热门文章

  1. 【汇编语言】通用寄存器和基础汇编指令
  2. 银行总行相较分行有什么不同?
  3. [深度学习] imgaug边界框增强笔记
  4. Go测试覆盖率 - Goc
  5. E影安全智能浏览器之界面
  6. 通过POI操作Excel的导入导出
  7. element-ui中el-select下拉框数据过多,用pinyin-match实现拼音、首字母、汉字等模糊搜索
  8. 04 非父子组件传值
  9. python实现指定数据库指定表的数据同步(监听binlog)
  10. 统计|假设检验中的P值(pvalue)如何看/怎样理解