Java享元模式(FlyWeight)
享元模式
內存屬于稀缺資源,不要隨便浪費。如果有很多個完全相同或相似的
對象,我們可以通過享元模式,節省內存.
核心:
享元模式以共享的方式高效地支持大量細粒度對象的重用。
享元對象能做到共享的關鍵是區分了內部狀態和外部狀態。
? 內部狀態:可以共享,不會隨環境變化而改變
? 外部狀態:不可以共享,會隨環境變化而改變
案例
圍棋軟件設計
每個圍棋棋子都是一個對象,
有如下屬性:
享元模式實現:
FlyweightFactory享元工廠類
? 創建并管理享元對象,享元池一般設計成鍵值對
FlyWeight抽象享元類
? 通常是一個接口或抽象類,聲明公共方法,這些方法可以向外界提供對象
的內部狀態,設置外部狀態。
ConcreteFlyWeight具體享元類
? 為內部狀態提供成員變量進行存儲
UnsharedConcreteFlyWeight非共享享元類
? 不能被共享的子類可以設計為非共享享元類
享元模式實現的UML圖
實現代碼
享元類
/** * 享元類 * @author 波波烤鴨 * @email dengpbs@163.com * */ public interface ChessFlyWeight { void setColor(String c); String getColor(); void display(Coordinate c); } /** * 棋子 具體實現類 * @author 波波烤鴨 * @email dengpbs@163.com * */ class ConcreteChess implements ChessFlyWeight { private String color; public ConcreteChess(String color) { super(); this.color = color; } @Override public void display(Coordinate c) { System.out.println("棋子顏色:"+color); System.out.println("棋子位置:"+c.getX()+"----"+c.getY()); } @Override public String getColor() { return color; } @Override public void setColor(String c) { this.color = c; } }
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
43
外部狀態
/** * 外部狀態UnSharedConcreteFlyWeight * @author 波波烤鴨 * @email dengpbs@163.com * */ public class Coordinate { private int x,y; public Coordinate(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
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
享元工廠類
/** *享元工廠類 * 創建棋子 * @author 波波烤鴨 * @email dengpbs@163.com * */ public class ChessFlyWeightFactory { //享元池 根據顏色保存不同的棋子對象 private static Map
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
測試類
public class Client { public static void main(String[] args) { ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色"); ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess("黑色"); ChessFlyWeight chess3 = ChessFlyWeightFactory.getChess("白色"); System.out.println(chess1); System.out.println(chess2); System.out.println(chess3); System.out.println("增加外部狀態的處理==========="); chess1.display(new Coordinate(10, 10)); chess2.display(new Coordinate(20, 20)); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
輸出結果:
com.bjsxt.flyweight.ConcreteChess@15db9742 com.bjsxt.flyweight.ConcreteChess@15db9742 com.bjsxt.flyweight.ConcreteChess@6d06d69c 增加外部狀態的處理=========== 棋子顏色:黑色 棋子位置:10----10 棋子顏色:黑色 棋子位置:20----20
1
2
3
4
5
6
7
8
享元模式開發中應用的場景:
享元模式由于其共享的特性,可以在任何“池”中操作,比如:線程池、數據庫連接池。 String類的設計也是享元模式
優點
極大減少內存中對象的數量
相同或相似對象內存中只存一份,極大的節約資源,提高系統性能
外部狀態相對獨立,不影響內部狀態
缺點
模式較復雜,使程序邏輯復雜化
為了節省內存,共享了內部狀態,分離出外部狀態,而讀取外部狀態
使運行時間變長。用時間換取了空間。
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。