『设计模式』写代码偷懒小技巧,程序开发大智慧--享元模式
23種設計模式+額外常用設計模式匯總 (持續更新)
享元模式
享元模式(Flyweight Pattern)主要用于減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬于結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的方式。
享元模式講類的屬性分為內外屬性(狀態),內屬性(狀態)可共享,通過內屬性結合傳入的外部屬性使用不同的功能(如棋盤橫縱坐標,文字的字號顏色等),當相同內屬性對象存在時,重用現有對象,不存在該對象時創建該對象。
實現原理:
通過HashMap存儲現有對象,并通過唯一字段判斷內存中是否存在可共享的對象,如果存在即返回現有對象,不存在則創建對象并添加到HashMap中。
主要解決:
在有大量細粒度對象時需要被創建時,可能會占用大量內存,為了減少內存的使用量,我們把其中共同的部分抽象出來,如果有相同的業務請求,直接返回在內存中已有的對象,避免重新創建。
(網上很多說是為了解決內存溢出,這里本人認為,解決內存溢出是減少內存用使用量帶來的,此設計模式并不是為了解決內存溢出的問題而設計的,只是可以解決內存,主要目的還是減少內存使用量而且還是只是在有大量細粒度對象被創建時才會有效,不然也不會降低內存使用)
何時使用:
1、系統中有大量對象。 2、這些對象消耗大量內存。 3、這些對象的狀態大部分可以外部化。 4、這些對象可以按照內蘊狀態分為很多組,當把外蘊對象從對象中剔除出來時,每一組對象都可以用一個對象來代替。 5、系統不依賴于這些對象身份,這些對象是不可分辨的。
優點:
大大減少對象的創建,降低系統的內存,使效率提高。
缺點:
提高了系統的復雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨著內部狀態的變化而變化,否則會造成系統的混亂。
實現:
UML(大話設計模式):
上面UML是比較經典的,以下是對上面的UML圖進行優化后的代碼!
再舉一個五子棋的例子,如果每一個棋子占用一個對象,那么下滿的話需要上百個對象,我們可以利用享元模式:
package 享元模式_五子棋;public class Loc {private int x;private int y;public Loc(int x, int y) {this.x = x;this.y = y;}public String show(){return "("+x+","+y+")";}}package 享元模式_五子棋;public abstract class Chess {public abstract void Place_Chess(Loc loc);}package 享元模式_五子棋;public class Chess_Concrete extends Chess {private String type;@Overridepublic void Place_Chess(Loc loc) {System.out.println(type+"落子:"+loc.show());}public Chess_Concrete(String type) {this.type = type;}}package 享元模式_五子棋;import java.util.HashMap;public class Chess_Factory {private HashMap<String, Chess> chess_container=new HashMap<>();public Chess get_Chess(String s){if(!chess_container.containsKey(s)){chess_container.put(s, new Chess_Concrete(s));}return chess_container.get(s);}}package 享元模式_五子棋;public class Client {public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0;i<=10;i++){String s="黑棋";if(i%2==0) s="白棋";Chess_Factory CF=new Chess_Factory();Chess_Concrete cc=(Chess_Concrete) CF.get_Chess(s);cc.Place_Chess(new Loc(i,i));}}}寫在最后:
Name:風骨散人,目前是一名雙非在校大學生,預計考研,熱愛編程,熱愛技術,喜歡分享,知識無界,希望我的分享可以幫到你!名字的含義:我想有一天我能有能力隨心所欲不逾矩,不總是向生活低頭,有能力讓家人擁有富足的生活而不是為了生計而到處奔波。“世人慌慌張張,不過是圖碎銀幾兩。偏偏這碎銀幾兩,能解世間惆悵,可讓父母安康,可護幼子成長 …”
文章主要內容:
Python,C++,C語言,JAVA,C#等語言的教程
ACM題解、模板、算法等,主要是數據結構,數學和圖論
設計模式,數據庫,計算機網絡,操作系統,計算機組成原理
Python爬蟲、深度學習、機器學習
計算機系408考研的所有專業課內容
目前還在更新中,先關注不迷路。微信公眾號,cnblogs(博客園),CSDN同名“風骨散人”
如果有什么想看的,可以私信我,如果在能力范圍內,我會發布相應的博文!
感謝大家的閱讀!😘你的點贊、收藏、關注是對我最大的鼓勵!
總結
以上是生活随笔為你收集整理的『设计模式』写代码偷懒小技巧,程序开发大智慧--享元模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 又又又融资1.35亿美元!贾跃亭喊话:F
- 下一篇: Adobe Camera RAW获升级: