【设计模式】享元模式

目录

什么是享元模式

代码实现


什么是享元模式

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

代码实现

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

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是享元工厂类,负责创建和管理享元对象。客户端通过工厂类获取享元对象,并传递外部状态给享元对象进行操作。

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

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

相关推荐
马剑威(威哥爱编程)36 分钟前
读写锁分离设计模式详解
java·设计模式·java-ee
修道-032338 分钟前
【JAVA】二、设计模式之策略模式
java·设计模式·策略模式
G皮T4 小时前
【设计模式】结构型模式(四):组合模式、享元模式
java·设计模式·组合模式·享元模式·composite·flyweight
W_Meng_H4 小时前
设计模式-组合模式
设计模式·组合模式
吾与谁归in14 小时前
【C#设计模式(8)——过滤器模式(Adapter Pattern)】
设计模式·c#·过滤器模式
G皮T15 小时前
【设计模式】行为型模式(一):模板方法模式、观察者模式
java·观察者模式·设计模式·模板方法模式·template method·行为型模式·observer
iFlyCai18 小时前
23种设计模式的Flutter实现第一篇创建型模式(一)
flutter·设计模式·dart
zhouzhihao_0718 小时前
程序代码设计模式之模板方法模式(1)
java·设计模式·模板方法模式
xianwu54318 小时前
【设计模式】工厂模式
开发语言·c++·设计模式·简单工厂模式·抽象工厂模式
树懒_Zz1 天前
设计模式-状态模式(State)
设计模式·状态模式