結構型設計模式 享元模式詳解

2022-03-11 13:36:29 字數 1969 閱讀 8034

享元模式(flyweight pattern)也叫蠅量模式,運用共享技術有效地支援大量細粒度物件的復用。常用於系統底層開發,解決系統效能問題。例如資料庫連線池,裡面都是建立好的連線物件,如果有我們需要的,直接拿來用,避免重新建立,可以解決重複物件對記憶體造成浪費的問題

享元模式提出了細粒度和共享物件,這裡就涉及了內部狀態和外部狀態的概念,即可以把物件的資訊分為兩個部分:內部狀態和外部狀態

內部狀態(intrinsic state):可以共享的相同內容外部狀態(extrinsic state):需要外部環境來設定的不能共享的內容舉個栗子,圍棋理論上有 361 個位置可以放棋子,每盤棋可能會產生兩三百個棋子物件,由於記憶體有限,一台伺服器很難支援更多玩家進行圍棋對戰,如果用享元模式來處理棋子,將棋子的顏色(黑與白)作為內部狀態,棋子的位置(不確定)作為外部狀態,就可以將棋子物件減少到兩個例項(黑棋、白棋),這樣就可以很好的解決記憶體開銷問題。

「抽象享元類」

public abstract class abstractwebsite
「非共享具體享元類」

public class user 

public string getname()

}

「具體享元類」

public class concretewebsite extends abstractwebsite 

/*** 發布

*/@override

public void publish(user user)

}

「享元工廠類」

public class websitefactory 

return pool.get(type);

}/**

* 計算物件池中物件的個數

*/public int count()

}

「測試類」

public class client 

}

「執行結果」

使用者「張三」發布的**形式為「新聞」

使用者「李四」發布的**形式為「新聞」

使用者「王五」發布的**形式為「部落格」

使用者「趙六」發布的**形式為「部落格」

物件的個數:3

首先我們看一段**,執行結果是什麼?

public class integersource 

}

答案
v1等於v2? true

v3等於v4? false

分析:檢視 integer 原始碼,找到valueof方法,可以看到,如果i在某個範圍內,就不會產生新的物件,直接從快取陣列中獲取,點進integercache裡就會發現low = -128high = 127,因此,我們可以理解為這個陣列就是「內部狀態」

public static integer valueof(int i)
優點:缺點:適用場景:

設計模式 結構型 享元模式

如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用 還有物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件。public class flyweighttest class flyweightfactory publi...

GO設計模式 結構型 享元模式

享元模式就是將大量物件共有的部分抽取出來,供這些物件共享使用。而這些元素不同的部分,會以引數的形式注入具體享元的相關方法中。ps 其實感覺有點像sync.pool,本質都是快取共享物件,降低記憶體消耗和減輕gc壓力,但是仔細看下來還是和sync.pool有點區別的 快取共享物件,降低記憶體消耗 在遊...

設計模式 結構型之享元模式

如果乙個類的大量例項的部分屬性都相同,就把這些屬性抽離成新類,這樣的類結構叫享元模式 享元模式就是不同例項的成員變數共享同乙個例項,降低記憶體占用 但是由於享元模式快取的物件不會被jvm 除非驗證過有效能提公升,否則不要濫用 享元模式由3部分組成 享元類 public class flyweight...