享元模式

本文最后更新于 2025年7月26日 凌晨

享元模式通过共享技术有效地支持大量细粒度的对象

角色

  1. 抽象享元角色, 它是产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现
  2. 具体享元角色,是具体的产品类,实现抽象角色定义的业务
  3. 享元工厂 ,用于构造一个池容器,同时提供从池中获得对象的方法

场景

享元模式一般用于创建一个池容器用来一次性创建一组资源对象,当服务需要使用对应资源时,从容器中直接取出资源对象进行使用,减少了频繁创建/销毁资源对象的开销。同时解耦了资源与资源调用请求过程。方便对资源进行统一管理

使用享元模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 创建基础资源实现类
public class Toy{
private String name ;

public String getName(){
return name ;
}

public void setName(String name){
this.name = name ;
}
@Override
public String toString(){
return "Toy Name" + name ;
}
}
// 创建池容器。定义获取资源对象的方法
public class ToyFactory{
private static Map<String , Toy>toyMap = new HashMap<>();

public static Toy getToy(String name ){
Toy toy = toyMap.get(name);
if(toy == null){
toy = new toy();
toy.setName(name);
toyMap.put(name,toy);
}
return toy ;
}
}
// 调用
public class Test{
public static void main(String[] args){
// 第一次使用会创建对应资源
Toy toy1 = ToyFactory.getToy("变形金刚");
Toy toy2 = ToyFactory.getToy("数码暴龙");


System.out.println(toy1 == ToyFactory.getToy("变形金刚")); // true

}
}

总结

享元模式是一种通过共享对象来避免重复创建,优化系统性能的结构型设计模式。在本例中,我们以 Toy 类为共享对象,通过 ToyFactory 实现了一个简单的对象池:当请求相同名称的玩具时,直接从池中返回已有实例,而不是重复创建,从而达到资源复用的目的。

享元模式的核心在于:

  • 共享内部状态 :不随使用者变化,可复用;
  • 分离外部状态 :由调用者动态传入,不参与共享;
  • 工厂统一管理对象池 :保障同一类型只创建一次。

适用于需要频繁创建大量相似对象的场景,如游戏资源、连接池、图形系统等。通过享元模式,系统不仅节省了内存,还提升了对象管理的集中性与一致性。


享元模式
http://gadoid.io/2025/07/26/享元模式/
作者
Codfish
发布于
2025年7月26日
许可协议