返回

享元模式:轻量级对象复用 利器

后端

享元模式:轻量级对象复用 利器

前言

目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

本节给大家讲一下设计模式中的享元模式,并结合实际业务场景给大家讲解如何使用~

本专题的所有案例代码主要以Java语言编写, 其他语言的同学可以自行转换一下~

什么是享元模式?

享元模式(Flyweight Pattern)是一种设计模式,用于减少对象的数量,从而提高性能。享元模式创建一组共享的对象,这些对象可以由多个客户端同时使用。这可以显著降低内存使用量,并提高应用程序的性能。

享元模式的英文名称为“Flyweight”,意为“轻量级”。享元模式的对象通常非常小,并且不包含任何状态。因此,它们可以被多个客户端同时使用,而不会对应用程序的性能造成太大影响。

享元模式的典型应用场景是:当系统中存在大量相似对象时,就可以使用享元模式来减少对象的创建数量。例如:在一个文字处理软件中,如果存在大量相同的字符,就可以使用享元模式来减少字符对象的创建数量。

享元模式的结构

享元模式的结构图如下:

享元模式的结构图

  • 享元工厂(Flyweight Factory) :享元工厂负责创建和管理享元对象。
  • 享元对象(Flyweight) :享元对象是共享的对象,可以被多个客户端同时使用。
  • 非享元对象(Concrete Flyweight) :非享元对象是享元对象的具体实现。
  • 客户端(Client) :客户端使用享元对象来完成任务。

享元模式的优点

享元模式具有以下优点:

  • 减少内存使用量:享元模式可以减少对象的创建数量,从而降低内存使用量。
  • 提高性能:享元模式可以提高应用程序的性能,因为共享对象可以被多个客户端同时使用,而不会对应用程序的性能造成太大影响。
  • 简化代码:享元模式可以简化代码,因为可以减少对象的创建数量。

享元模式的缺点

享元模式也存在以下缺点:

  • 可能会降低灵活性:享元模式的对象通常不包含任何状态,因此它们可能缺乏灵活性。
  • 可能会增加复杂性:享元模式的实现可能会增加应用程序的复杂性。

享元模式的应用场景

享元模式可以应用于以下场景:

  • 当系统中存在大量相似对象时,就可以使用享元模式来减少对象的创建数量。
  • 当对象的状态不需要存储在对象本身时,就可以使用享元模式来减少内存使用量。
  • 当对象需要频繁创建和销毁时,就可以使用享元模式来提高性能。

享元模式的示例

Java代码示例

// 享元工厂
public class FlyweightFactory {

    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        Flyweight flyweight = flyweights.get(key);
        if (flyweight == null) {
            flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }
}

// 享元对象
interface Flyweight {

    void operation(String extrinsicState);
}

// 非享元对象
class ConcreteFlyweight implements Flyweight {

    private String intrinsicState;

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

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

// 客户端
public class Client {

    public static void main(String[] args) {
        FlyweightFactory flyweightFactory = new FlyweightFactory();

        Flyweight flyweight1 = flyweightFactory.getFlyweight("A");
        flyweight1.operation("Extrinsic State 1");

        Flyweight flyweight2 = flyweightFactory.getFlyweight("B");
        flyweight2.operation("Extrinsic State 2");

        Flyweight flyweight3 = flyweightFactory.getFlyweight("A");
        flyweight3.operation("Extrinsic State 3");
    }
}

运行结果

Intrinsic State: A
Extrinsic State: Extrinsic State 1
Intrinsic State: B
Extrinsic State: Extrinsic State 2
Intrinsic State: A
Extrinsic State: Extrinsic State 3

从运行结果可以看出,享元模式可以减少对象的创建数量。在该示例中,尽管创建了三个Flyweight对象,但实际