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}
}
🧩 優點
-
大量相似對象可以復用,節省內存,提升性能
-
將共享與非共享狀態區分清晰,結構更清晰
?? 缺點
-
系統邏輯變復雜,需要區分內部與外部狀態
-
不適合對象差異性大的情況
? 使用建議
-
適用于如下情況:
-
游戲對象池(如子彈、精靈)
-
數據庫連接池、線程池
-
文本編輯器中的字體對象共享