Java享元模式(FlyWeight)

      網友投稿 742 2022-05-29

      享元模式

      內存屬于稀缺資源,不要隨便浪費。如果有很多個完全相同或相似的

      對象,我們可以通過享元模式,節省內存.

      核心:

      享元模式以共享的方式高效地支持大量細粒度對象的重用。

      享元對象能做到共享的關鍵是區分了內部狀態和外部狀態。

      ? 內部狀態:可以共享,不會隨環境變化而改變

      ? 外部狀態:不可以共享,會隨環境變化而改變

      案例

      圍棋軟件設計

      每個圍棋棋子都是一個對象,

      有如下屬性:

      享元模式實現:

      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 map = new HashMap(); public static ChessFlyWeight getChess(String color){ // 如果已經存在該顏色的棋子返回 if(map.get(color)!=null){ return map.get(color); }else{ // 如果享元池中沒有該顏色的棋子就創建一個新的返回 并存儲在享元池中 ChessFlyWeight cfw = new ConcreteChess(color); map.put(color, cfw); return cfw; } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      Java享元模式(FlyWeight)

      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小時內刪除侵權內容。

      上一篇:汽車電子嵌入式開發系列50篇(五)-OS操作系統的進程與線程
      下一篇:操作系統資源管理技術
      相關文章
      中文字幕精品三区无码亚洲| 亚洲VA中文字幕不卡无码| 亚洲午夜国产精品无码老牛影视| 午夜亚洲WWW湿好爽| 亚洲成人福利网站| 亚洲黄色片在线观看| 亚洲国产综合91精品麻豆| 亚洲AV日韩AV永久无码绿巨人| 亚洲VA中文字幕无码一二三区| 国产精品亚洲精品日韩已满| 亚洲日韩精品一区二区三区无码| 亚洲日韩在线中文字幕第一页| 亚洲精品国产V片在线观看| 亚洲人成网站色在线入口| 亚洲无码视频在线| 亚洲午夜福利精品无码| 亚洲欧洲精品成人久久曰影片| 亚洲无码日韩精品第一页| 国产亚洲精午夜久久久久久| 国产aⅴ无码专区亚洲av麻豆| 日本亚洲成高清一区二区三区| 国产精品久久久亚洲| 亚洲AV成人无码久久精品老人| 亚洲av无码一区二区乱子伦as | 亚洲av成人一区二区三区观看在线| 亚洲人成色77777在线观看| 亚洲AV无码一区二区三区电影| 国产成人综合亚洲| 亚洲色偷拍区另类无码专区| 日本亚洲国产一区二区三区| 九月丁香婷婷亚洲综合色| 亚洲AV乱码久久精品蜜桃| 亚洲视屏在线观看| 国产成人精品日本亚洲专| 亚洲熟妇成人精品一区| 国产精品久久久久久亚洲小说| 久久久久亚洲精品天堂久久久久久| 亚洲人成网站在线播放vr| 亚洲国产精品热久久| 亚洲精品国产福利片| 亚洲高清一区二区三区|