本文最后更新于 2025年7月26日 凌晨
享元模式通过共享技术有效地支持大量细粒度的对象
角色
- 抽象享元角色, 它是产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现
- 具体享元角色,是具体的产品类,实现抽象角色定义的业务
- 享元工厂 ,用于构造一个池容器,同时提供从池中获得对象的方法
场景
享元模式一般用于创建一个池容器用来一次性创建一组资源对象,当服务需要使用对应资源时,从容器中直接取出资源对象进行使用,减少了频繁创建/销毁资源对象的开销。同时解耦了资源与资源调用请求过程。方便对资源进行统一管理
使用享元模式
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("变形金刚"));
} }
|
总结
享元模式是一种通过共享对象来避免重复创建,优化系统性能的结构型设计模式。在本例中,我们以 Toy 类为共享对象,通过 ToyFactory 实现了一个简单的对象池:当请求相同名称的玩具时,直接从池中返回已有实例,而不是重复创建,从而达到资源复用的目的。
享元模式的核心在于:
- 共享内部状态 :不随使用者变化,可复用;
- 分离外部状态 :由调用者动态传入,不参与共享;
- 工厂统一管理对象池 :保障同一类型只创建一次。
适用于需要频繁创建大量相似对象的场景,如游戏资源、连接池、图形系统等。通过享元模式,系统不仅节省了内存,还提升了对象管理的集中性与一致性。