2026-04-24 09:33:35
享元模式是一种结构型设计模式,通过共享技术复用大量细粒度对象,减少内存占用并提高性能。 其核心在于区分对象的内部状态(可共享)和外部状态(不可共享),并通过工厂管理共享对象。
享元模式的核心角色定义共享对象的公共接口(如AbstractBox),声明内部状态和外部状态的操作方法。
实现抽象接口,存储内部状态(如IBox、LBox等具体形状类)。
不需要共享的子类(案例中未涉及,但可用于扩展非共享属性)。
管理享元对象池(如BoxFactory),通过单例模式确保唯一性,按需提供共享对象。
抽象享元类定义共性行为(如显示形状和颜色):
public abstract class AbstractBox { public abstract String getShape(); public void display(String color) { System.out.println("方块形状:" + getShape() + " 颜色:" + color); }}具体享元类实现不同形状(I、L、O):
public class IBox extends AbstractBox { @Override public String getShape() { return "I"; }}public class LBox extends AbstractBox { @Override public String getShape() { return "L"; }}享元工厂使用单例模式管理对象池,避免重复创建:
public class BoxFactory { private static HashMap<String, AbstractBox> map; private BoxFactory() { map = new HashMap<>(); map.put("I", new IBox()); map.put("L", new LBox()); map.put("O", new OBox()); } public static BoxFactory getInstance() { return SingletonHolder.INSTANCE; } private static class SingletonHolder { private static final BoxFactory INSTANCE = new BoxFactory(); } public AbstractBox getBox(String key) { return map.get(key); }}客户端调用通过工厂获取共享对象,并动态设置颜色(外部状态):
public class Client { public static void main(String[] args) { BoxFactory factory = BoxFactory.getInstance(); AbstractBox box1 = factory.getBox("I"); box1.display("红色"); // 输出:方块形状:I 颜色:红色 AbstractBox box2 = factory.getBox("L"); box2.display("蓝色"); // 输出:方块形状:L 颜色:蓝色 }}仅存储内部状态的对象(如7种形状)被复用,而非为每种颜色创建新对象。
避免频繁创建和销毁相似对象,适合游戏、文本编辑器等场景。
内部状态(不变)与外部状态(可变)解耦,增强灵活性。
享元模式通过共享对象池优化内存使用,尤其适合细粒度对象的复用。在俄罗斯方块案例中,形状作为内部状态被共享,颜色作为外部状态动态传递,显著减少了对象数量。理解内部/外部状态的区分是应用享元模式的关键。