Java设计模式:享元模式
享元模式
定义:
运用共享技术有效地支持大量细粒度的对象。系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量。
模式结构:
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设计模式:享元模式相关推荐
- 【设计模式】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é 设计模式 享元模式 ...
最新文章
- flowJS源码个人分析
- IAR建立stm32工程
- Apache ZooKeeper - 构建ZooKeeper源码环境及StandAlone模式下的服务端和客户端启动
- 11 Python - dict
- 全连接条件随机场_CRF条件随机场
- Delta3d角色注册机制
- 操作系统之文件管理:7、文件的系统层次
- 使用栈将递归函数转化为非递归函数_栈(Stack)及其应用-Python实现
- sql用户名数据迁移到mysql_如何将SQL Server数据迁移到MySQL
- 5个导致主线程卡顿较鲜为人知的元凶
- C 线程同步的四种方式(Windows)
- 数据库学习--数据库基本概念
- 基于ESP32制作流光溢彩氛围灯
- linux 谷歌浏览器设置代理_Linux系统下Firefox浏览器SSH代理服务器脚本及设置方法...
- Codeforces Round #469 (Div. 2) C. Zebras
- “找不到服务器ip地址”已解决,原因是DNS配置问题。
- 干货 | 产品经理如何画脑图
- Python基础笔记——函数
- mysql如何查询成绩前5名_sql 语句查询 前5名后5名的成绩
- IOS 10 推送