• 享元模式模式简介


    概念

    享元模式(Flyweight pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用和提高性能。它通过将对象的状态分为可共享的内部状态和不可共享的外部状态,来实现对象的共享。内部状态可以被多个对象共享,而外部状态则取决于具体的对象。通过共享内部状态,可以减少系统中相似对象的数量,从而节省内存空间。

    特点

    1. 减少内存占用:通过共享内部状态,减少了相似对象的数量,降低了内存占用。
    2. 提高性能:减少了创建相似对象的开销,提高了系统的性能。
    3. 分离内部状态和外部状态:内部状态可以共享,外部状态是独立的,客户端可以自行设置。

    优点

    1. 减少内存占用:通过共享内部状态,减少了相似对象的数量,降低了内存占用。
    2. 提高性能:减少了创建相似对象的开销,提高了系统的性能。
    3. 简化对象结构:通过将状态分离,简化了对象的结构,使得对象更加轻量级。

    缺点

    1. 对象共享可能导致线程安全问题:如果多个线程同时访问共享对象,并修改了外部状态,可能会导致线程安全问题。
    2. 增加了代码复杂性:为了实现对象的共享和分离状态,需要引入额外的逻辑,增加了代码的复杂性。

    适用场景

    1. 对象数量庞大且相似:当系统中存在大量相似的对象,并且这些对象的区别仅在于它们的内部状态时,可以考虑使用享元模式。
    2. 需要缓存对象的应用:当需要缓存对象以提高性能时,可以使用享元模式来共享对象。

    实现方式

    1. 内部状态和外部状态分离:将对象的状态分为内部状态和外部状态,内部状态可以共享,外部状态是独立的。
    2. 对象池:通过维护一个对象池来管理可共享的对象,客户端从对象池中获取对象,并设置外部状态。
    3. 使用工厂模式:可以结合工厂模式来创建享元对象,工厂负责管理对象的共享和创建。

    实现代码:

    1. import java.util.HashMap;
    2. import java.util.Map;
    3. // 抽象享元接口
    4. interface Flyweight {
    5. void operation(String extrinsicState);
    6. }
    7. // 具体享元类
    8. class ConcreteFlyweight implements Flyweight {
    9. private String intrinsicState;
    10. public ConcreteFlyweight(String intrinsicState) {
    11. this.intrinsicState = intrinsicState;
    12. }
    13. public void operation(String extrinsicState) {
    14. System.out.println("Intrinsic State: " + intrinsicState);
    15. System.out.println("Extrinsic State: " + extrinsicState);
    16. // 执行具体操作
    17. }
    18. }
    19. // 享元工厂类
    20. class FlyweightFactory {
    21. private Map flyweights = new HashMap<>();
    22. public Flyweight getFlyweight(String key) {
    23. if (flyweights.containsKey(key)) {
    24. return flyweights.get(key);
    25. } else {
    26. Flyweight flyweight = new ConcreteFlyweight(key);
    27. flyweights.put(key, flyweight);
    28. return flyweight;
    29. }
    30. }
    31. }
    32. public class Main {
    33. public static void main(String[] args) {
    34. FlyweightFactory factory = new FlyweightFactory();
    35. // 获取享元对象
    36. Flyweight flyweight1 = factory.getFlyweight("key1");
    37. Flyweight flyweight2 = factory.getFlyweight("key1");
    38. // 调用享元对象的操作方法,传入外部状态
    39. flyweight1.operation("state1");
    40. flyweight2.operation("state2");
    41. }
    42. }

    在这个简单的示例代码中,我们创建了一个具体享元类ConcreteFlyweight,它包含了内部状态intrinsicStateFlyweightFactory是享元工厂类,它维护了一个享元对象的池,并通过getFlyweight方法返回具体的享元对象。内部状态在具体享元对象内部管理,而外部状态由客户端传入。

    客户端代码中,首先通过工厂类获取两个享元对象flyweight1flyweight2,他们共享了同一个享元对象,然后分别调用它们的operation方法,传入外部状态。从而实现了共享内部状态,同时处理各自的外部状态。

  • 相关阅读:
    神经网络解决过拟合的方法,神经网络过拟合解决
    m分集2跳OFDM系统中基于功率分配和子载波配对算法的信道容量matlab仿真
    Xilinx ISE系列教程(6):ModelSim联合仿真
    MySQL应用——常见故障分析和检查
    windows常用
    1711: 【穷举】满足条件的整数
    Docker 部署网页版 vscode (code-server)
    【Arduino+ESP32专题】使用Arduino类库 TFT_eSPI驱动2.4寸彩屏
    AI 律助 Alpha GPT 线上实操发布会,重磅发布!
    day34 集合总结
  • 原文地址:https://blog.csdn.net/aidscooler/article/details/133064577