网络营销网站源码,企业网站建设不要空间可以吗,广州网站建设哪里好,吉林省白山市建设厅网站首页享元模式是一种结构型设计模式#xff0c;主要通过共享技术有效地减少大量细粒度对象的复用#xff0c;以减少内存占用和提高性能。由于享元模式要求能够共享的对象必须是细粒度对象#xff0c;因此它又称为轻量级模式。
Flyweight is a structural pattern, which effecti…享元模式是一种结构型设计模式主要通过共享技术有效地减少大量细粒度对象的复用以减少内存占用和提高性能。由于享元模式要求能够共享的对象必须是细粒度对象因此它又称为轻量级模式。
Flyweight is a structural pattern, which effectively reduces the reuse of a large number of fine-grained objects through sharing technology to reduce memory consumption and improve performance. Since the flyweight pattern requires that objects that can be shared must be fine-grained objects, it is also called lightweight mode. 结构设计
Flyweight: 抽象享元类包含原始对象中部分能在多个对象中共享的状态。 同一享元对象可在许多不同情景中使用。 享元中存储的状态被称为 “内在状态”。 传递给享元方法的状态被称为 “外在状态”。 ConcreteFlyweight: 具体享元类实现享元接口并为内部状态(如果存在的话)增加存储空间。 UnsharedConcreteFlyweight: 非共享具体享元类抽象享元类使共享成为可能但并不强制共享。 FlyweightFactory: 享元工厂类 享元工厂会对已有享元的缓存池进行管理。 有了工厂后 客户端就无需直接创建享元 它们只需调用工厂并向其传递目标享元的一些内在状态即可。 工厂会根据参数在之前已创建的享元中进行查找 如果找到满足条件的享元就将其返回 如果没有找到就根据参数新建享元。 享元模式类图表示如下
伪代码实现
接下来将使用代码介绍下享元模式的实现。
// 1、抽象享元类存储的状态被称为 内在状态。 传递给享元方法的状态被称为 外在状态
public abstract class Flyweight {private String intrinsic;protected String extrinsic;public Flyweight(String extrinsic) {this.extrinsic extrinsic;}public abstract void operation(String extrinsic);
}
// 2、具体享元类实现享元接口
public class ConcreteFlyweight extends Flyweight {public ConcreteFlyweight(String extrinsic) {super(extrinsic);}Overridepublic void operation(String extrinsic) {System.out.println(do some thing in the concrete flyweight instance);}
}
// 3、非共享具体享元类抽象享元类使共享成为可能但并不强制共享
public class UnsharedConcreteFlyweight extends Flyweight {public UnsharedConcreteFlyweight(String extrinsic) {super(extrinsic);}Overridepublic void operation(String extrinsic) {System.out.println(do some thing in the unshared concrete flyweight instance);}
}
// 4、享元工厂类 享元工厂会对已有享元的缓存池进行管理。 有了工厂后 客户端就无需直接创建享元
// 它们只需调用工厂并向其传递目标享元的一些状态即可
public class FlyweightFactory {private static final MapString, Flyweight pool new HashMap();public static Flyweight getFlyweight(String extrinsic) {Flyweight flyweight pool.get(extrinsic);if (flyweight null) {flyweight new ConcreteFlyweight(extrinsic);pool.put(extrinsic, flyweight);System.out.println(put a fly weight instance to the pool);}return flyweight;}
}
// 5、客户端调用
public class FlyweightClient {public void test() {// 从享元工厂获取享元类Flyweight flyweight1 FlyweightFactory.getFlyweight(one);// 执行享元方法flyweight1.operation(one);// 从享元工厂获取重复享元类(直接从缓存池获取)Flyweight flyweight2 FlyweightFactory.getFlyweight(one);flyweight2.operation(one);// 获取非共享享元子类Flyweight unsharedConcreteFlyweight new UnsharedConcreteFlyweight(two);unsharedConcreteFlyweight.operation(two);}
}适用场景
在以下情况下可以考虑使用享元模式 (1) 一个系统有大量相同或者相似的对象由于这类对象的大量使用造成内存的大量耗费。 应用该模式所获的收益大小取决于使用它的方式和情景。它在下列情况中最有效 程序需要生成数量巨大的相似对象 这将耗尽目标设备的所有内存 对象中包含可抽取且能在多个对象间共享的重复状态 (2) 对象的大部分状态都可以外部化可以将这些外部状态传入对象中。 使用享元模式需要维护一个存储享元对象的享元池而这需要耗费资源因此应当在多次重复使用享元对象时才值得使用享元模式。
优缺点
享元模式有以下优点 (1) 节省内存。享元模式的优点在于它可以极大减少内存中对象的数量使得相同对象或相似对象在内存中只保存一份。如果程序中有很多相似对象那么可以考虑使用该模式 (2) 享元模式的外部状态相对独立而且不会影响其内部状态从而使得享元对象可以在不同的环境中被共享 但是享元模式也存在以下缺点 (1) 可能需要牺牲执行速度来换取内存为了使对象可以共享享元模式需要将享元对象的状态外部化而读取外部状态使得运行时间变长。 (2) 代码会变得更加复杂。 需要分离出内部状态和外部状态这使得程序的逻辑复杂化
参考
《设计模式 可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著, 李英军, 马晓星等译 https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/flyweight.html 享元模式 https://refactoringguru.cn/design-patterns/flyweight 享元模式 https://www.runoob.com/design-pattern/flyweight-pattern.html 享元模式 https://www.cnblogs.com/adamjwh/p/9070107.html 简说设计模式——享元模式 https://blog.csdn.net/ShuSheng0007/article/details/116424138 秒懂设计模式之享元模式