网站推广 昆明,关于建立网站的思路,wordpress两个侧边栏,app十大免费下载排行榜目录 一、 啥是享元模式#xff1f;二、 为什么要用享元模式#xff1f;三、 享元模式的实现方式四、 享元模式的优缺点五、 享元模式的应用场景六、 总结 #x1f31f;我的其他文章也讲解的比较有趣#x1f601;#xff0c;如果喜欢博主的讲解方式#xff0c;可以多多支… 目录 一、 啥是享元模式二、 为什么要用享元模式三、 享元模式的实现方式四、 享元模式的优缺点五、 享元模式的应用场景六、 总结 我的其他文章也讲解的比较有趣如果喜欢博主的讲解方式可以多多支持一下感谢 了解组合模式请看 (十 一)趣学设计模式 之 组合模式 ✨更多请看个人主页 码熔burning 这篇文章带你详细认识一下设计模式中的享元模式
一、 啥是享元模式
想象一下你正在玩一个大型的在线游戏 。 游戏中有成千上万的士兵 每个士兵都有自己的位置、生命值、装备等等。 如果为每个士兵都创建一个完整的对象会消耗大量的内存 。 但是很多士兵的外观、属性都是相同的只有位置不同。
享元模式就是运用共享技术有效地支持大量细粒度的对象 享元模式通过共享尽可能多的对象来最小化内存使用 。
简单来说就是把对象的状态分成内部状态和外部状态共享内部状态减少对象数量 ♻️
你的程序需要创建大量的相似对象 就像游戏中的士兵 对象的很多状态都可以共享 就像士兵的外观、属性 你想减少内存消耗 就像你想让游戏运行更流畅
二、 为什么要用享元模式
用享元模式好处多多
减少内存消耗 通过共享对象减少内存占用 提高性能 减少对象创建和销毁的开销 提高系统扩展性 可以支持更多的对象 ➕
三、 享元模式的实现方式
享元模式主要包含以下几个角色
Flyweight享元 定义享元对象的接口声明可以被共享的内部状态并提供接受外部状态的方法。 (比如士兵的基类)ConcreteFlyweight具体享元 实现享元接口存储内部状态。 (比如具体的士兵对象)UnsharedConcreteFlyweight非共享具体享元 不是共享的享元对象通常包含一些不能被共享的状态。 (比如拥有特殊装备的士兵)FlyweightFactory享元工厂 创建和管理享元对象确保享元对象可以被共享。 (比如士兵工厂)Client客户端 使用享元对象并提供外部状态。 (比如游戏客户端)
内部状态 指的是对象可以共享的状态存储在享元对象内部不会随着环境改变而改变。 (比如士兵的外观、属性) 外部状态 指的是对象不能共享的状态需要由客户端提供会随着环境改变而改变。 (比如士兵的位置、生命值)
代码示例
import java.util.HashMap;
import java.util.Map;// 享元士兵接口
public interface Soldier {void display(int x, int y); // 显示士兵
}// 具体享元士兵
public class ConcreteSoldier implements Soldier {private String model; // 士兵模型public ConcreteSoldier(String model) {this.model model;}Overridepublic void display(int x, int y) {System.out.println(士兵模型 model 位置( x , y ));}
}// 享元工厂士兵工厂
public class SoldierFactory {private static MapString, Soldier soldierMap new HashMap(); // 存储士兵对象public static Soldier getSoldier(String model) {Soldier soldier soldierMap.get(model);if (soldier null) {soldier new ConcreteSoldier(model);soldierMap.put(model, soldier);}return soldier;}
}// 客户端
public class Client {public static void main(String[] args) {Soldier soldier1 SoldierFactory.getSoldier(步兵); // 获取步兵soldier1.display(10, 20); // 显示步兵Soldier soldier2 SoldierFactory.getSoldier(步兵); // 获取步兵soldier2.display(30, 40); // 显示步兵Soldier soldier3 SoldierFactory.getSoldier(骑兵); // 获取骑兵soldier3.display(50, 60); // 显示骑兵System.out.println(士兵数量 SoldierFactory.soldierMap.size()); // 输出士兵数量}
}分析
Soldier 是享元接口定义了士兵的显示方法。ConcreteSoldier 是具体享元实现了士兵接口存储了士兵的模型。SoldierFactory 是享元工厂创建和管理士兵对象确保相同模型的士兵对象只创建一个。
输出结果
士兵模型步兵位置(10, 20)
士兵模型步兵位置(30, 40)
士兵模型骑兵位置(50, 60)
士兵数量2可以看到虽然创建了三个士兵对象但是实际只创建了两个士兵对象因为步兵对象被共享了。
四、 享元模式的优缺点
优点
减少内存消耗 提高性能 提高系统扩展性 ➕
缺点
增加了系统的复杂度 需要分离内部状态和外部状态设计难度较高 共享对象的状态不可修改否则会影响其他使用该对象的客户端
五、 享元模式的应用场景
当你的程序需要创建大量的相似对象时 就像游戏中的士兵 对象的很多状态都可以共享 就像士兵的外观、属性 你想减少内存消耗 就像你想让游戏运行更流畅 文本编辑器 文本编辑器可以使用享元模式来共享字符对象减少内存消耗。数据库连接池 数据库连接池可以使用享元模式来共享数据库连接对象提高性能。
六、 总结
享元模式就像把对象的状态分成内部状态和外部状态共享内部状态减少对象数量 ♻️主要包含享元、具体享元、非共享具体享元和享元工厂四个角色 优点是减少内存消耗、提高性能、提高系统扩展性 缺点是增加复杂度、设计难度较高、共享对象的状态不可修改 适用于需要创建大量的相似对象且对象的很多状态都可以共享的场景
希望这篇文章能让你彻底理解享元模式 祝你学习愉快 看完请看(十 三)趣学设计模式 之 模版方法模式