享元模式 怼烎@ 2021-11-11 10:50 248阅读 0赞 当系统中出现大量相同、相似的对象时,会导致系统性能下降。享元模式通过共享技术对相同或相似对象进行重用,从而解决这一问题。在享元模式中,存储共享实例对象的地方称为**享元池 (Flyweight Pool)** **享元模式(Flyweigh Pattern):**运用共享技术支持大量细粒度对象的复用。又称为轻量级模式,是一种对象结构型模式 共享模式有内部状态和外部状态之分 **内部状态:**即存储在享元对象内部并且不会随环境而改变的状态,可以共享 **外部状态:**随着环境改变而改变,不可以共享的状态 享元模式结构包含如下角色 抽象享元类(Flyweight):一个接口或抽象类,该类中声明了具体享元类的公共方法 具体享元类(ConcreteFlyweight):实现了抽象享元类,其实例称为享元对象。可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一享元对象 享元工厂类(FlyweightFactory):用于创建并管理享元对象,其针对抽象享元类编程,将各种类型的具体享元类存储在一个享元池中 下面代码演示享元模式 定义抽象享元类 package com.design.structural.flyweight; /** * 抽象享元类 */ public interface AbstractFlyweight { void operation(); } 定义具体享元类 package com.design.structural.flyweight; /** * 具体享元类 */ public class ConcreteFlyweight implements AbstractFlyweight{ //内部状态 private String intrinsicState; //外部状态 private String extrinsicState; public ConcreteFlyweight(String extrinsicState) { this.extrinsicState = extrinsicState; } public void setIntrinsicState(String intrinsicState) { this.intrinsicState = intrinsicState; } @Override public void operation() { //业务逻辑 System.out.println(extrinsicState + ":" + intrinsicState); } } 定义享元工厂类 package com.design.structural.flyweight; import java.util.HashMap; import java.util.Map; /** * 享元工厂类 */ public class FlyweightFactory { //定义享元池容器 private static final Map<String, AbstractFlyweight> FLYWEIGHT_MAP = new HashMap<String, AbstractFlyweight>(); public static AbstractFlyweight getFlyweight(String extrinsicState){ ConcreteFlyweight concreteFlyweight = (ConcreteFlyweight) FLYWEIGHT_MAP.get(extrinsicState); if (concreteFlyweight == null){ //根据外部状态创建享元对象 concreteFlyweight = new ConcreteFlyweight(extrinsicState); FLYWEIGHT_MAP.put(extrinsicState, concreteFlyweight); System.out.println("创建对象" + extrinsicState); } return concreteFlyweight; } } 类图如下 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzanp6Y2Jx_size_16_color_FFFFFF_t_70][] 测试调用类 package com.design.structural.flyweight; public class TestMain { public static void main(String[] args) { ConcreteFlyweight cf1 = (ConcreteFlyweight) FlyweightFactory.getFlyweight("X"); cf1.setIntrinsicState("内部状态1"); cf1.operation(); ConcreteFlyweight cf2 = (ConcreteFlyweight) FlyweightFactory.getFlyweight("Y"); cf2.setIntrinsicState("内部状态2"); cf2.operation(); ConcreteFlyweight cf3 = (ConcreteFlyweight) FlyweightFactory.getFlyweight("X"); cf3.setIntrinsicState("内部状态3"); cf3.operation(); } } 调用结果如下 ![20190805214227153.png][] 从调用结果可以看出:X调用两次,但只创建了一次X,实现了享元模式 **享元模式总结** 优点:减少内存中对象数量;减少内存之外其他资源占用,提供系统性能 缺点:使系统程序逻辑复杂;关注内部、外部状态,线程安全问题; 适用场景:系统有大量相同相似的对象;需要缓冲池的场景 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzanp6Y2Jx_size_16_color_FFFFFF_t_70]: /images/20211109/b529e459299a40a99b50859db5c1ff15.png [20190805214227153.png]: /images/20211109/8c7f757725a5456fa08bf450dcbb1e56.png
相关 享元模式 简介 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应 ゝ一纸荒年。/ 2022年07月12日 07:28/ 0 赞/ 129 阅读
相关 享元模式 享元模式(Flyweight),就是运用共享技术有效地支持大量细粒度的对象。 享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(Externa 冷不防/ 2022年06月16日 23:20/ 0 赞/ 160 阅读
相关 享元模式 1.使用场景: 内存资源比较稀缺,不要随便浪费,如果有很多相同或者类似的对象,通过使用享元模式的方法,节省内存,例如线程池以及String类等。 2.UML表示 悠悠/ 2022年05月31日 09:49/ 0 赞/ 144 阅读
相关 享元模式 定义: 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应 谁借莪1个温暖的怀抱¢/ 2022年05月14日 02:54/ 0 赞/ 137 阅读
相关 享元模式 享元模式 一、概述 1. 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存。 2. 享元模式以共享的方式高效地 忘是亡心i/ 2022年04月18日 04:55/ 0 赞/ 162 阅读
相关 享元模式 [享元模式][Link 1] 模式说明 所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现 ゝ一世哀愁。/ 2021年11月23日 06:46/ 0 赞/ 213 阅读
相关 享元模式 当系统中出现大量相同、相似的对象时,会导致系统性能下降。享元模式通过共享技术对相同或相似对象进行重用,从而解决这一问题。在享元模式中,存储共享实例对象的地方称为享元池 (Fly 怼烎@/ 2021年11月11日 10:50/ 0 赞/ 249 阅读
相关 享元模式 12.享元模式 我们可以共用一个 Hello world 对象,其中字符串 “Hello world” 为内部状态,可共享;字体颜色为外部状态,不可共享,由 逃离我推掉我的手/ 2021年09月17日 00:00/ 0 赞/ 243 阅读
相关 享元模式 一 点睛 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。 柔光的暖阳◎/ 2021年07月24日 21:31/ 0 赞/ 345 阅读
相关 享元模式 简介 > Use sharing to support large numbers of fine-grained objects efficiently. > 使用 青旅半醒/ 2021年05月18日 20:36/ 0 赞/ 362 阅读
还没有评论,来说两句吧...