• Flyweight 享元


    意图

    运用共享技术有效地支持大量细粒度的对象。

    结构

    其中

    • Flyweight描述一个接口,通过这个接口Flyweight可以接受并作用于外部状态。
    • ConcreteFlyweight实现Flyweight接口,并作为内部状态(如果有)增加存储空间。
    • ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的,即它必须独立于ConcreteFlyweight对象的场景。
    • 并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不是强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
    • FlyweightFactory创建并管理Flyweight对象;确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者在不存在时创建一个实例。
    • Client维持一个对Flyweight的引用;计算或存储一个或多个Flyweight的外部状态。

    适用性

    • 一个应用程序使用了大量的对象。
    • 完全由于使用大量的对象,造成很大的存储开销。
    • 对象的大多数状态都可变为外部状态。
    • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
    • 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。

    代码示例。

    1. // Flyweight 接口
    2. interface Flyweight {
    3. void operation(ExtrinsicState state);
    4. }
    5. // ConcreteFlyweight 实现
    6. class ConcreteFlyweight implements Flyweight {
    7. private String intrinsicState;
    8. public ConcreteFlyweight(String intrinsicState) {
    9. this.intrinsicState = intrinsicState;
    10. }
    11. @Override
    12. public void operation(ExtrinsicState state) {
    13. System.out.println("Intrinsic state: " + intrinsicState);
    14. System.out.println("Extrinsic state: " + state.getValue());
    15. }
    16. }
    17. // 外部状态
    18. class ExtrinsicState {
    19. private String value;
    20. public ExtrinsicState(String value) {
    21. this.value = value;
    22. }
    23. public String getValue() {
    24. return value;
    25. }
    26. }
    27. // Flyweight 工厂
    28. class FlyweightFactory {
    29. private static Map pool = new HashMap<>();
    30. public static Flyweight get(String intrinsicState) {
    31. if (!pool.containsKey(intrinsicState)) {
    32. pool.put(intrinsicState, new ConcreteFlyweight(intrinsicState));
    33. }
    34. return pool.get(intrinsicState);
    35. }
    36. }
    37. // 客户端
    38. class Client {
    39. public static void main(String[] args) {
    40. ExtrinsicState state1 = new ExtrinsicState("state1");
    41. ExtrinsicState state2 = new ExtrinsicState("state2");
    42. Flyweight flyweight1 = FlyweightFactory.get("intrinsic1");
    43. Flyweight flyweight2 = FlyweightFactory.get("intrinsic2");
    44. flyweight1.operation(state1);
    45. flyweight2.operation(state2);
    46. System.out.println("Flyweight pool size: " + FlyweightFactory.pool.size());
    47. }
    48. }

    代码注释

    • Flyweight 接口定义了 Flyweight 对象必须实现的操作。
    • ConcreteFlyweight 类实现了 Flyweight 接口,并存储了内部状态。
    • ExtrinsicState 类表示外部状态。
    • FlyweightFactory 类创建和管理 Flyweight 对象。
    • Client 类使用 Flyweight 对象并提供外部状态。
  • 相关阅读:
    通过shell或java操作HDFS
    JuiceFS 即将发布 1.0 并调整开源许可
    [国产MCU]-W801开发实例-WiFi热点模式创建
    springboot的开发流程
    百度 T4 幕后揭秘!这份 Java 面试全栈手册竟让面试官节节败退
    【31】GPU(下):为什么深度学习需要使用GPU?
    爬虫兽问题解答1-抖音评论区爬虫采集拓客系统
    嵌入式FreeRTOS学习九,任务链表的构成,TICK时间中断和任务状态切换调度
    代码随想录算法训练营第三十三天丨 贪心算法part04
    珠宝加工厂:我的成本下降空间在哪里?
  • 原文地址:https://blog.csdn.net/u011096468/article/details/138010722