Java 享元模式(Flyweight Pattern)详解
🦋 什么是享元模式?
享元模式是一种结构型模式,它通过共享相同的对象来减少内存消耗,适用于大量细粒度对象的场景。关键思想是缓存重复出现的对象,避免重复创建。
🧠 使用场景
- 系统中存在大量相似对象
- 对象的状态可分为内部状态(可共享)和外部状态(不可共享)
- 对象创建代价高,影响性能
🏗️ 模式结构
- Flyweight(享元抽象类):定义共享接口
- ConcreteFlyweight(具体享元类):实现共享逻辑,存储内部状态
- FlyweightFactory(享元工厂):管理享元对象池,复用已有对象
✅ 示例:围棋棋子池
享元接口(Flyweight)
public interface ChessPiece {void display(String position);
}
具体享元(ConcreteFlyweight)
public class BlackChess implements ChessPiece {@Overridepublic void display(String position) {System.out.println("⚫ 黑棋,位置:" + position);}
}public class WhiteChess implements ChessPiece {@Overridepublic void display(String position) {System.out.println("⚪ 白棋,位置:" + position);}
}
享元工厂(FlyweightFactory)
import java.util.HashMap;
import java.util.Map;public class ChessFactory {private static final Map<String, ChessPiece> cache = new HashMap<>();public static ChessPiece getChess(String color) {ChessPiece piece = cache.get(color);if (piece == null) {if (color.equalsIgnoreCase("black")) {piece = new BlackChess();} else if (color.equalsIgnoreCase("white")) {piece = new WhiteChess();}cache.put(color, piece);}return piece;}
}
客户端调用
public class Client {public static void main(String[] args) {ChessPiece black1 = ChessFactory.getChess("black");ChessPiece black2 = ChessFactory.getChess("black");ChessPiece white1 = ChessFactory.getChess("white");black1.display("A1");black2.display("B2");white1.display("C3");System.out.println("black1 与 black2 是否为同一对象?" + (black1 == black2)); // true}
}
🧩 优点
-
大量相似对象可以复用,节省内存,提升性能
-
将共享与非共享状态区分清晰,结构更清晰
⚠️ 缺点
-
系统逻辑变复杂,需要区分内部与外部状态
-
不适合对象差异性大的情况
✅ 使用建议
-
适用于如下情况:
-
游戏对象池(如子弹、精灵)
-
数据库连接池、线程池
-
文本编辑器中的字体对象共享