享元模式(FlyWeight)
享元模式使用場景:
內存屬于稀缺資源,不要隨便浪費。如果有很多個完全相同或相似的對象,我們可以用通過享元模式,節省內存。
享元模式的核心:?
享元模式以共享的方式高效的支持大量細粒度對象的重用。?
享元對象能做到共享的關鍵是區分了內部狀態和外部狀態。內部狀態:可以共享,不會隨環境變化而改變;外部狀態:不可以共享,會隨環境變化而改變。
享元模式的實現:?
FlyWeight享元工廠類:創建并管理享元對象,享元池一般設計成鍵值對;?
FlyWeight抽象享元類:通常是一個接口或者抽象類,聲明公共方法,這些方法可以向外界提供對象的內部狀態,設置外部狀態;
ConcreteFlyWeight具體享元類:為內部狀態提供成員變量進行存儲;?
UnsharedConcreteFlyWeight非共享享元類:不能被共享的子類可以設計為非共享享元類。
?
下面通過棋子的例子代碼來解釋:?
首先,創建棋子的坐標類,由于不同棋子坐標不同,是不能共享的,所以該類是UnSharedConcreteFlyWeight:
package com.note.pattern.flyweight;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;}}
創建抽象享元類FlyWeight和具體享元類ConcreteFlyWeight
package com.note.pattern.flyweight;public interface ChessFlyWeight {String getColor();void display(Coordinate c);}class ConcreteChess implements ChessFlyWeight {private String color;public ConcreteChess(String color) {super();this.color = color;}@Overridepublic String getColor() {return color;}@Overridepublic void display(Coordinate c) {System.out.println("棋子顏色:" + color);System.out.println("棋子位置:" + c.getX() + "----" + c.getY());}}
創建享元工廠類:
package com.note.pattern.flyweight;import java.util.HashMap; import java.util.Map;public class ChessFlyWeightFactory {private static Map<String, ChessFlyWeight> map = new HashMap<>();public static ChessFlyWeight getChess(String color) {if(map.get(color) != null) {return map.get(color);}else {ChessFlyWeight chess = new ConcreteChess(color);map.put(color, chess);return chess;}}}客戶端測試:
package com.note.pattern.flyweight;public class Client {public static void main(String[] args) {ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色");ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess("黑色");System.out.println(chess1);System.out.println(chess2);System.out.println("增加外部狀態的處理===========");chess1.display(new Coordinate(10, 10));chess2.display(new Coordinate(20, 20));}}
運行結果
com.note.pattern.flyweight.ConcreteChess@7852e922 com.note.pattern.flyweight.ConcreteChess@7852e922 增加外部狀態的處理=========== 棋子顏色:黑色 棋子位置:10----10 棋子顏色:黑色 棋子位置:20----20
可以發現,chess1和chess2兩個棋子屬于同一個對象,它們的顏色屬性屬于內部狀態,實現了共享,但是它們的坐標屬性屬于外部狀態,沒有實現共享,并不相同。這樣節省了內存空間。
享元模式在開發中應用場景:?
享元模式由于其共享的特性,可以在任何“池”中操作,比如線程池,數據庫連接池;?
String類的設計也是享元模式
享元模式的優缺點:?
優點:?
極大地減少了內存中對象的數量;?
相同或相似對象內存中只存一份,極大地節約了資源,提高系統性能;?
外部狀態相對獨立,不影響內部狀態;?
缺點:?
模式較為復雜,使程序邏輯復雜化;?
為了節省內存,共享了內部狀態,分離出外部狀態,而讀取外部狀態使運行時間變長,用時間換取了空間。
?
轉載于:https://www.cnblogs.com/zhaojianhua/p/8257497.html
總結
以上是生活随笔為你收集整理的享元模式(FlyWeight)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二阶段团队每日冲刺07
- 下一篇: Win10+Python+Django+