【设计模式】享元模式

目录

什么是享元模式

代码实现


什么是享元模式

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

代码实现

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

import java.util.HashMap;
import java.util.Map;

// 抽象享元接口
interface Flyweight {
    void operation(String externalState);
}

// 具体享元类
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void operation(String externalState) {
        System.out.println("ConcreteFlyweight: Intrinsic State - " + intrinsicState + ", Extrinsic State - " + externalState);
    }
}

// 享元工厂类
class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (!flyweights.containsKey(key)) {
            flyweights.put(key, new ConcreteFlyweight(key));
        }
        return flyweights.get(key);
    }
}

// 客户端
public class FlyweightPatternExample {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        // 客户端使用享元对象
        Flyweight flyweight1 = factory.getFlyweight("key1");
        flyweight1.operation("externalState1");

        Flyweight flyweight2 = factory.getFlyweight("key2");
        flyweight2.operation("externalState2");

        Flyweight flyweight3 = factory.getFlyweight("key1");
        flyweight3.operation("externalState3");

        // 检查是否共享了相同的对象
        System.out.println("Is flyweight1 the same object as flyweight3? " + (flyweight1 == flyweight3));
    }
}

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

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

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

相关推荐

  1. 设计模式

    2024-04-21 19:18:03       34 阅读
  2. 设计模式-模式

    2024-04-21 19:18:03       32 阅读
  3. 设计模式模式

    2024-04-21 19:18:03       16 阅读
  4. 设计模式模式

    2024-04-21 19:18:03       15 阅读
  5. 【前端设计模式】之模式

    2024-04-21 19:18:03       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-21 19:18:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-21 19:18:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-21 19:18:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-21 19:18:03       20 阅读

热门阅读

  1. 批量控制教程-Ansible管理windows

    2024-04-21 19:18:03       15 阅读
  2. 【Ansible】02

    2024-04-21 19:18:03       12 阅读
  3. linux的工具tcptrace的输出信息的解释和介绍

    2024-04-21 19:18:03       15 阅读
  4. 【设计模式】7、decorate 装饰模式

    2024-04-21 19:18:03       12 阅读
  5. 黑马点评项目遇到的部分问题

    2024-04-21 19:18:03       57 阅读
  6. 关于指针变量的理解

    2024-04-21 19:18:03       16 阅读
  7. react脚手架创建项目,配置别名(alias)

    2024-04-21 19:18:03       17 阅读
  8. 面试经典150题——跳跃游戏

    2024-04-21 19:18:03       40 阅读
  9. dns高防和ip高防的区别是什么?

    2024-04-21 19:18:03       49 阅读