享元模式(Flyweight Pattern)主要用於減小建立對象的數量,以減小內存佔用和提升性能。這種類型的設計模式屬於結構型模式,它提供了減小對象數量從而改善應用所需的對象結構的方式。數據庫
享元模式嘗試重用現有的同類對象,若是未找到匹配的對象,則建立新對象。咱們將經過建立 5 個對象來畫出 20 個分佈於不一樣位置的圓來演示這種模式。因爲只有 5 種可用的顏色,因此 color 屬性被用來檢查現有的 Circle 對象。設計模式
意圖:運用共享技術有效地支持大量細粒度的對象。緩存
主要解決:在有大量對象時,有可能會形成內存溢出,咱們把其中共同的部分抽象出來,若是有相同的業務請求,直接返回在內存中已有的對象,避免從新建立。安全
什麼時候使用: 一、系統中有大量對象。 二、這些對象消耗大量內存。 三、這些對象的狀態大部分能夠外部化。 四、這些對象能夠按照內蘊狀態分爲不少組,當把外蘊對象從對象中剔除出來時,每一組對象均可以用一個對象來代替。 五、系統不依賴於這些對象身份,這些對象是不可分辨的。性能
如何解決:用惟一標識碼判斷,若是在內存中有,則返回這個惟一標識碼所標識的對象。spa
關鍵代碼:用 HashMap 存儲這些對象。線程
應用實例: 一、JAVA 中的 String,若是有則返回,若是沒有則建立一個字符串保存在字符串緩存池裏面。 二、數據庫的數據池。設計
優勢:大大減小對象的建立,下降系統的內存,使效率提升。對象
缺點:提升了系統的複雜度,須要分離出外部狀態和內部狀態,並且外部狀態具備固有化的性質,不該該隨着內部狀態的變化而變化,不然會形成系統的混亂。blog
使用場景: 一、系統有大量類似對象。 二、須要緩衝池的場景。
注意事項: 一、注意劃分外部狀態和內部狀態,不然可能會引發線程安全問題。 二、這些類必須有一個工廠對象加以控制。
咱們將建立一個 Shape 接口和實現了 Shape 接口的實體類 Circle。下一步是定義工廠類 ShapeFactory。
ShapeFactory 有一個 Circle 的 HashMap,其中鍵名爲 Circle 對象的顏色。不管什麼時候接收到請求,都會建立一個特定顏色的圓。ShapeFactory 檢查它的 HashMap 中的 circle 對象,若是找到 Circle 對象,則返回該對象,不然將建立一個存儲在 hashmap 中以備後續使用的新對象,並把該對象返回到客戶端。
FlyWeightPatternDemo,咱們的演示類使用 ShapeFactory 來獲取 Shape 對象。它將向 ShapeFactory 傳遞信息(red / green / blue/ black / white),以便獲取它所需對象的顏色。