前言
在Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(8)外观模式》文章中,我们介绍了外观模式。本文是这个系列的第九篇章,我们将讲解一下享元模式的实现方式、应用场景以及它的用途。
享元模式
享元模式是一种结构型设计模式,是通过共享对象来减少内存使用和提高性能。在该模式中,对象分为内部状态和外部状态,其中内部状态是可共享的,而外部状态是不可共享的。通过共享内部状态,可以减少系统中重复对象的数量,从而减少内存消耗。
使用场景
- 当一个应用程序使用大量相似对象时,享元模式可以帮助减少内存消耗。
- 当对象的大部分状态可以外部化并且可以在多个对象中共享时,可以考虑使用享元模式。
- 当需要频繁创建和销毁对象,且创建对象的代价比维护对象的代价高时,可以使用享元模式来减少创建对象的数量。
代码实现
使用享元模式实现内外部状态描述;定义一个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("开朗");
这里就简单的实现内部状态是可共享的,而外部状态是不可共享的;外部状态不管怎么变,其内部状态仍然是“焦虑”的。
结语
其实享元模式还有很多其他的应用场景,比如:
- 在文本编辑器中,字符对象可以使用享元模式来共享相同的字符,节省内存空间。
- 在游戏中,精灵对象可能存在大量重复,通过享元模式来共享相同的精灵对象,减少内存占用和提高渲染性能。
- 在数据库连接池中的连接对象可以使用享元模式来复用,减少连接对象的创建和销毁,提高系统性能。等等。