Loading...

Java设计模式(9)享元模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(8)外观模式》文章中,我们介绍了外观模式。本文是这个系列的第九篇章,我们将讲解一下享元模式的实现方式、应用场景以及它的用途。

享元模式

享元模式是一种结构型设计模式,是通过共享对象来减少内存使用和提高性能。在该模式中,对象分为内部状态外部状态,其中内部状态是可共享的,而外部状态是不可共享的。通过共享内部状态,可以减少系统中重复对象的数量,从而减少内存消耗。

使用场景

  1. 当一个应用程序使用大量相似对象时,享元模式可以帮助减少内存消耗。
  2. 当对象的大部分状态可以外部化并且可以在多个对象中共享时,可以考虑使用享元模式。
  3. 当需要频繁创建和销毁对象,且创建对象的代价比维护对象的代价高时,可以使用享元模式来减少创建对象的数量。

代码实现

使用享元模式实现内外部状态描述;定义一个Flyweight接口

/**
 * 享元接口
 * @author Jensen
 * @date 2024-02-28
 * */
public interface Flyweight {
    void operation(String state);
}

创建 FlyweightImpl类 并实现状态的具体操作

public class FlyweightImpl implements Flyweight {
    private final String innerState;

    public FlyweightImpl(String innerState) {
        this.innerState = innerState;
    }

    @Override
    public void operation(String state) {
        System.out.println("外部状态是:"+state+","+"内部状态是:"+innerState);
    }
}

随后创建享元工厂类 FlyweightFactory  它负责管理 Flyweight 对象的创建和共享。

/**
 * 享元工厂
 * @author Jensen
 * @date 2024-02-28
 * */
public class FlyweightFactory {
    private final Map<String,Flyweight> flyweightMap = new HashMap<>();
    public Flyweight getFlyweight(String k){
        return flyweightMap.computeIfAbsent(k, FlyweightImpl::new);
    }
}

测试使用

System.out.println("------------------------------享元模式-----------------------------");
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight anxiety = flyweightFactory.getFlyweight("焦虑");
anxiety.operation("平淡");
anxiety.operation("开朗");

这里就简单的实现内部状态是可共享的,而外部状态是不可共享的;外部状态不管怎么变,其内部状态仍然是“焦虑”的。

image.png

结语

其实享元模式还有很多其他的应用场景,比如:

  • 在文本编辑器中,字符对象可以使用享元模式来共享相同的字符,节省内存空间。
  • 在游戏中,精灵对象可能存在大量重复,通过享元模式来共享相同的精灵对象,减少内存占用和提高渲染性能。
  • 在数据库连接池中的连接对象可以使用享元模式来复用,减少连接对象的创建和销毁,提高系统性能。等等。

0

回到顶部