1.目的:運用共享技術有效地支持大量細粒度的對象
Flyweight(享元)設計模式 是一種結構型設計模式,它的核心目的是通過共享對象來減少內存消耗,特別是在需要大量相似對象的場景中。Flyweight 模式通過將對象的共享細節與不變的部分分離,盡量減少系統中對象的數量,進而提高系統的性能。
主要問題:
如果一個系統中有大量相似的對象,它們的狀態可能大部分是相同的。每個對象都會占用內存,并且在程序中創建大量相似對象會導致內存浪費和性能下降。Flyweight 模式的解決方案是將這些相似對象中共享的部分提取出來,集中存儲共享,而把變動的部分存儲在客戶端。
主要組成部分:
-
Flyweight(享元)接口:定義享元對象的行為。享元對象通常是不可變的(immutable),因此它們可以安全地在多個客戶端之間共享。
-
ConcreteFlyweight(具體享元):實現了 Flyweight 接口,存儲共享的狀態。
-
FlyweightFactory(享元工廠):負責管理享元對象的創建和共享,確保每個享元對象都被重復使用。
-
UnsharedConcreteFlyweight(非共享的具體享元):不共享的享元對象,通常用于保存可變狀態(例如,特定于客戶端的狀態)。
示例:
假設我們有一個系統,需要表示大量的 棋盤。棋盤上每個格子都有顏色、位置等屬性,但在同一個棋盤上,很多格子可能具有相同的顏色或樣式。我們可以使用 Flyweight 模式來優化內存消耗,減少重復的對象實例。
代碼示例:
// 享元接口
interface ChessPiece {void draw();
}// 具體享元類
class ConcreteChessPiece implements ChessPiece {private String color; // 享元的共享部分public ConcreteChessPiece(String color) {this.color = color;}@Overridepublic void draw() {System.out.println("Drawing " + color + " chess piece.");}
}// 享元工廠
class ChessPieceFactory {private Map<String, ChessPiece> chessPieces = new HashMap<>();public ChessPiece getChessPiece(String color) {ChessPiece piece = chessPieces.get(color);if (piece == null) {piece = new ConcreteChessPiece(color);
// 給向享元工廠, put對象,下一次就不用判斷為空了, 直接從工程里取出來就值chessPieces.put(color, piece);System.out.println("Creating new " + color + " chess piece.");}return piece;}
}// 客戶端代碼
public class FlyweightPatternDemo {public static void main(String[] args) {ChessPieceFactory factory = new ChessPieceFactory();ChessPiece whitePiece1 = factory.getChessPiece("White");whitePiece1.draw();ChessPiece blackPiece1 = factory.getChessPiece("Black");blackPiece1.draw();ChessPiece whitePiece2 = factory.getChessPiece("White");whitePiece2.draw();ChessPiece blackPiece2 = factory.getChessPiece("Black");blackPiece2.draw();ChessPiece whitePiece3 = factory.getChessPiece("White");whitePiece3.draw();}
}運行結果
Creating new White chess piece.
Drawing White chess piece.
Creating new Black chess piece.
Drawing Black chess piece.
Drawing White chess piece.
Drawing Black chess piece.
Drawing White chess piece.