网站首页 > 精选教程 正文
一、享元模式定义
享元模式是一种结构型设计模式,主要用于减少创建对象的数量,通过共享技术来有效支持大量细粒度对象的复用,避免大量相似对象的开销,从而减少内存占用并提高系统性能。
二、享元模式角色构成
- 抽象享元(Flyweight):定义享元对象的接口,规定具体享元类需要实现的方法,通过这些方法可操作享元对象的内在状态以及接收外在状态参数。
- 具体享元(ConcreteFlyweight):实现抽象享元类的接口,负责存储和管理享元对象的内在状态,实现相关业务逻辑方法,相同类型的具体享元对象可被多个地方共享使用。
- 享元工厂(FlyweightFactory):负责创建和管理享元对象,维护一个享元对象的缓存池,当客户端请求时,先检查缓存池中是否存在该对象,存在则直接返回,否则创建新的享元对象放入缓存池后再返回给客户端。
- 客户端(Client):负责使用享元对象,向享元工厂请求享元对象,并通过调用享元对象的方法来完成业务逻辑,调用时传入相应的外在状态参数,以区分不同情况下享元对象的具体行为。
三、享元模式适用场景
- 游戏开发:如大型多人在线游戏中有大量的怪物、道具等对象。同类型的怪物具有相同的生命值、攻击力等属性,道具也有相同的属性和功能等,可将这些相同的属性作为内部状态共享,而怪物的位置、道具的持有玩家等作为外部状态,减少对象创建数量。
- 图形绘制:在绘图软件中,绘制大量相同形状但位置不同的图形,如多个相同的圆形、矩形等。可将图形的形状、颜色等属性作为共享的内部状态,图形的坐标位置等作为外部状态。
- 缓存系统:缓存中的数据很多时候具有相似性,比如缓存网页片段、数据库查询结果等。可以把相同的缓存内容作为共享的内部状态,而缓存的时间戳、缓存的来源等作为外部状态。
四、享元模式优缺点
- 优点节省内存:对于大量重复出现且有相同部分属性的对象,只存储一份共有的内在状态,大大减少内存占用。提高性能:复用已有的享元对象,避免频繁创建对象的开销,提升程序整体性能,在处理大量对象时效果明显。便于维护:享元工厂集中管理享元对象,当需要对共享对象进行修改或扩展时,只需在享元工厂和具体享元类中进行操作,便于维护和管理。
- 缺点增加复杂性:需要将对象的状态分为内部状态和外部状态,增加了程序设计和实现的复杂性,使程序逻辑更难理解。运行时间变长:读取享元模式的外部状态可能会使运行时间稍微变长,因为需要额外的操作来处理外部状态。线程安全问题:在多线程环境下,共享的享元对象可能会引起线程安全问题,需要进行适当的同步处理。
五、享元模式Java代码样例
// 抽象享元类,定义字符的基本操作接口
abstract class CharacterFlyweight {
public abstract void display(char extrinsicState);
}
// 具体享元类,比如这里以英文字母为例
class ConcreteCharacterFlyweight extends CharacterFlyweight {
private char intrinsicState; // 内在状态,这里假设是字符本身
public ConcreteCharacterFlyweight(char c) {
this.intrinsicState = c;
}
@Override
public void display(char extrinsicState) {
System.out.println("显示字符" + intrinsicState + ",外在状态(位置等):" + extrinsicState);
}
}
// 享元工厂类,用于创建和管理享元对象
class CharacterFlyweightFactory {
private Map flyweights = new HashMap<>();
public CharacterFlyweight getCharacterFlyweight(char c) {
if (flyweights.containsKey(c)) {
return flyweights.get(c);
} else {
CharacterFlyweight newFlyweight = new ConcreteCharacterFlyweight(c);
flyweights.put(c, newFlyweight);
return newFlyweight;
}
}
}
// 客户端
public class Client {
public static void main(String[] args) {
CharacterFlyweightFactory factory = new CharacterFlyweightFactory();
CharacterFlyweight charA = factory.getCharacterFlyweight('A');
charA.display('1');
CharacterFlyweight charB = factory.getCharacterFlyweight('B');
charB.display('2');
CharacterFlyweight charAAgain = factory.getCharacterFlyweight('A');
charAAgain.display('3');
}
}
在上述代码中,CharacterFlyweight是抽象享元类,
ConcreteCharacterFlyweight是具体享元类,CharacterFlyweightFactory是享元工厂类,Client是客户端。客户端通过享元工厂获取享元对象,并传入外部状态来调用享元对象的方法,实现了享元模式的基本功能。
- 上一篇: Java设计模式系列之装饰器模式介绍
- 下一篇: 快速上手Java设计模式之简介
猜你喜欢
- 2025-03-10 java设计模式(4)-适配器模式
- 2025-03-10 Java设计模式:桥接模式,干货总结
- 2025-03-10 Java,设计模式,结构型,外观模式,对外提供一个一致的接口
- 2025-03-10 Java设计模式:适配器模式,干货总结
- 2025-03-10 Java设计模式:代理模式,干货总结
- 2025-03-10 「java设计模式」(7)——策略模式(案例解析)
- 2025-03-10 Java开发篇——设计模式(5)装饰设计模式
- 2025-03-10 快速上手Java设计模式之简介
- 2025-03-10 Java设计模式系列之装饰器模式介绍
- 2025-03-10 Java设计模式——命令模式
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)