目录
- 享元模式(Flyweight)
- 适用场景
- 享元模式实例代码(Java)
享元模式(Flyweight)
运用共享技术有效地支持大量细粒度的对象。(业务模型的对象进行细分得到科学合理的更多对象)
适用场景
- 一个应用程序使用了大量的对象。
- 完全由于使用大量的对象,造成很大的存储开销。
- 对象的大多数状态都可变为外部状态。
- 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
- 应用程序不依赖于对象标识。由于 Flyweight 对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。
✦ Flyweight 描述一个接口,通过这个接口 Flyweight 可以接受并作用于外部状态。
✦ ConcreteFlyweight 实现 Flyweight 接口,并为内部状态(如果有)增加存储空间。 ConcreteFlyweight 对象必须是可共享的。它所存储的状态必须是内部的,即它必须独立于 ConcreteFlyweight 对象的场景。
✦ 并非所有的 Flyweight 子类都需要被共享。Flyweight 接口使共享成为可能,但它并不强制共享。在 Flyweight 对象结构的某些层次,UnsharedConcreteFlyweight 对象通常将 ConcreteFlyweight 对象作为子结点。
✦ FlyweightFactory 创建并管理 Flyweight 对象;确保合理地共享 Flyweight ,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个己创建的实例或者在不存在时创建一个实例。
✦ Client 维持一个对 Flyweight 的引用;计算或存储一个或多个 Flyweight 的外部状态。
享元模式实例代码(Java)
import java.util.*;// Flyweight
abstract class Shape {protected String color;public abstract void draw(int x, int y);
}// ConcreteFlyweight
class Circle extends Shape {public Circle(String color) {this.color = color;}@Overridepublic void draw(int x, int y) {System.out.println("draw a color:" + color + " circle x:" + x + " y:" + y);}
}// FlyweightFactory
class ShapeFactory {// FlyweightFactory创建并管理Flyweight对象;// 确保合理地共享 Flyweight ,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个己创建的实例或者在不存在时创建一个实例。private Map<String, Shape> map = new HashMap<String, Shape>();public Shape getShape(String key) {if (!map.containsKey(key)) {map.put(key, new Circle(key));System.out.println("create color:" + key + " circle");}return map.get(key);}
}public class FlyWeightMain {public static void main(String[] args) {ShapeFactory factory = new ShapeFactory();Random random = new Random();String[] colors = {"red", "blue", "green", "white", "black"};for (int i = 1; i <= 100; i++) {int x = random.nextInt(colors.length); // [0 ~ 4]Shape shape = factory.getShape(colors[x]);System.out.print("第" + i + "个圆:");shape.draw(random.nextInt(2022), random.nextInt(528));}}
}
其他设计模式详见本专栏其他博文~
特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
zst_2001的个人空间