• 【设计模式】享元模式


    目录

    什么是享元模式

    代码实现


    什么是享元模式

            Java中的享元模式(Flyweight Pattern)是一种结构型设计模式,它用于减少系统中对象的数量,以节省内存和提高性能。享元模式通过共享相似对象之间的公共部分来最小化内存使用。

    在享元模式中,有两种类型的对象:

    1. 内部状态(Intrinsic State):是对象的共享部分,可以被多个对象共享。这些状态通常是不变的,并且不依赖于特定的上下文环境。

    2. 外部状态(Extrinsic State):是对象的非共享部分,是对象在特定上下文环境下的变化部分。外部状态需要由客户端来维护和传递。

    享元模式的核心思想是将内部状态和外部状态分离。内部状态由享元对象自身管理和维护,而外部状态由客户端来维护和传递。这样可以在一定程度上减少对象的数量,节省内存空间。

    享元模式通常包含以下角色:

    • 享元工厂(Flyweight Factory):负责创建和管理享元对象。它维护一个享元池(Flyweight Pool),用于存储已经创建的享元对象,并根据客户端的请求返回相应的享元对象。

    • 抽象享元(Flyweight):定义了享元对象的接口,包含了对内部状态的操作方法。通常是一个接口或抽象类。

    • 具体享元(Concrete Flyweight):实现了抽象享元接口,并为内部状态提供了具体的实现。具体享元对象可以被多个客户端共享。

    享元模式的主要优点包括:

    • 减少内存使用:通过共享相似对象的公共部分,减少了系统中对象的数量,节省了内存空间。

    • 提高性能:减少了对象的数量,可以降低系统的运行时开销,提高了系统的性能。

    • 灵活性:客户端可以通过外部状态来改变享元对象的行为,而不需要修改享元对象本身。

    享元模式适用于以下情况:

    • 当系统中存在大量相似对象,并且这些对象可以被共享时。

    • 当需要缓存对象以提高性能时,例如在网络请求中缓存已经请求过的数据。

            总之,享元模式是一种非常有用的设计模式,可以帮助我们减少系统中对象的数量,节省内存空间,并提高系统的性能。

    代码实现

    下面是一个简单的Java代码示例,演示了如何使用享元模式:      

    1. import java.util.HashMap;
    2. import java.util.Map;
    3. // 抽象享元接口
    4. interface Flyweight {
    5. void operation(String externalState);
    6. }
    7. // 具体享元类
    8. class ConcreteFlyweight implements Flyweight {
    9. private String intrinsicState;
    10. public ConcreteFlyweight(String intrinsicState) {
    11. this.intrinsicState = intrinsicState;
    12. }
    13. @Override
    14. public void operation(String externalState) {
    15. System.out.println("ConcreteFlyweight: Intrinsic State - " + intrinsicState + ", Extrinsic State - " + externalState);
    16. }
    17. }
    18. // 享元工厂类
    19. class FlyweightFactory {
    20. private Map flyweights = new HashMap<>();
    21. public Flyweight getFlyweight(String key) {
    22. if (!flyweights.containsKey(key)) {
    23. flyweights.put(key, new ConcreteFlyweight(key));
    24. }
    25. return flyweights.get(key);
    26. }
    27. }
    28. // 客户端
    29. public class FlyweightPatternExample {
    30. public static void main(String[] args) {
    31. FlyweightFactory factory = new FlyweightFactory();
    32. // 客户端使用享元对象
    33. Flyweight flyweight1 = factory.getFlyweight("key1");
    34. flyweight1.operation("externalState1");
    35. Flyweight flyweight2 = factory.getFlyweight("key2");
    36. flyweight2.operation("externalState2");
    37. Flyweight flyweight3 = factory.getFlyweight("key1");
    38. flyweight3.operation("externalState3");
    39. // 检查是否共享了相同的对象
    40. System.out.println("Is flyweight1 the same object as flyweight3? " + (flyweight1 == flyweight3));
    41. }
    42. }

            在这个示例中,Flyweight是享元接口,定义了享元对象的操作方法。ConcreteFlyweight是具体享元类,实现了抽象享元接口,并为内部状态提供了具体的实现。FlyweightFactory是享元工厂类,负责创建和管理享元对象。客户端通过工厂类获取享元对象,并传递外部状态给享元对象进行操作。

            在客户端代码中,我们创建了几个享元对象,并为每个对象传递了不同的外部状态。我们还通过工厂类获取了相同的享元对象,并检查它们是否共享了相同的对象。

            非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~

  • 相关阅读:
    vue3在父组件的jsx代码中使用具名插槽
    【子平真诠】擂台赛中的一个癸生子月的坤造
    vue3项目中使用富文本编辑器
    ST表(RMQ问题)
    论文笔记:HG-SL 面向假新闻早期发现的全局和本地用户传播行为联合学习
    Python实战——Selenium与iframe结合应用
    RTC实验
    jenkins平台上设置全局变量
    ubuntu 22.04 安装 minikube 和 istio
    反射型XSS实验(2)
  • 原文地址:https://blog.csdn.net/qq_22193961/article/details/137893701