『设计模式』写代码偷懒小技巧,程序开发大智慧--享元模式
23種設(shè)計(jì)模式+額外常用設(shè)計(jì)模式匯總 (持續(xù)更新)
享元模式
享元模式(Flyweight Pattern)主要用于減少創(chuàng)建對象的數(shù)量,以減少內(nèi)存占用和提高性能。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它提供了減少對象數(shù)量從而改善應(yīng)用所需的對象結(jié)構(gòu)的方式。
享元模式講類的屬性分為內(nèi)外屬性(狀態(tài)),內(nèi)屬性(狀態(tài))可共享,通過內(nèi)屬性結(jié)合傳入的外部屬性使用不同的功能(如棋盤橫縱坐標(biāo),文字的字號顏色等),當(dāng)相同內(nèi)屬性對象存在時(shí),重用現(xiàn)有對象,不存在該對象時(shí)創(chuàng)建該對象。
實(shí)現(xiàn)原理:
通過HashMap存儲(chǔ)現(xiàn)有對象,并通過唯一字段判斷內(nèi)存中是否存在可共享的對象,如果存在即返回現(xiàn)有對象,不存在則創(chuàng)建對象并添加到HashMap中。
主要解決:
在有大量細(xì)粒度對象時(shí)需要被創(chuàng)建時(shí),可能會(huì)占用大量內(nèi)存,為了減少內(nèi)存的使用量,我們把其中共同的部分抽象出來,如果有相同的業(yè)務(wù)請求,直接返回在內(nèi)存中已有的對象,避免重新創(chuàng)建。
(網(wǎng)上很多說是為了解決內(nèi)存溢出,這里本人認(rèn)為,解決內(nèi)存溢出是減少內(nèi)存用使用量帶來的,此設(shè)計(jì)模式并不是為了解決內(nèi)存溢出的問題而設(shè)計(jì)的,只是可以解決內(nèi)存,主要目的還是減少內(nèi)存使用量而且還是只是在有大量細(xì)粒度對象被創(chuàng)建時(shí)才會(huì)有效,不然也不會(huì)降低內(nèi)存使用)
何時(shí)使用:
1、系統(tǒng)中有大量對象。 2、這些對象消耗大量內(nèi)存。 3、這些對象的狀態(tài)大部分可以外部化。 4、這些對象可以按照內(nèi)蘊(yùn)狀態(tài)分為很多組,當(dāng)把外蘊(yùn)對象從對象中剔除出來時(shí),每一組對象都可以用一個(gè)對象來代替。 5、系統(tǒng)不依賴于這些對象身份,這些對象是不可分辨的。
優(yōu)點(diǎn):
大大減少對象的創(chuàng)建,降低系統(tǒng)的內(nèi)存,使效率提高。
缺點(diǎn):
提高了系統(tǒng)的復(fù)雜度,需要分離出外部狀態(tài)和內(nèi)部狀態(tài),而且外部狀態(tài)具有固有化的性質(zhì),不應(yīng)該隨著內(nèi)部狀態(tài)的變化而變化,否則會(huì)造成系統(tǒng)的混亂。
實(shí)現(xiàn):
UML(大話設(shè)計(jì)模式):
上面UML是比較經(jīng)典的,以下是對上面的UML圖進(jìn)行優(yōu)化后的代碼!
再舉一個(gè)五子棋的例子,如果每一個(gè)棋子占用一個(gè)對象,那么下滿的話需要上百個(gè)對象,我們可以利用享元模式:
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:風(fēng)骨散人,目前是一名雙非在校大學(xué)生,預(yù)計(jì)考研,熱愛編程,熱愛技術(shù),喜歡分享,知識無界,希望我的分享可以幫到你!名字的含義:我想有一天我能有能力隨心所欲不逾矩,不總是向生活低頭,有能力讓家人擁有富足的生活而不是為了生計(jì)而到處奔波。“世人慌慌張張,不過是圖碎銀幾兩。偏偏這碎銀幾兩,能解世間惆悵,可讓父母安康,可護(hù)幼子成長 …”
文章主要內(nèi)容:
Python,C++,C語言,JAVA,C#等語言的教程
ACM題解、模板、算法等,主要是數(shù)據(jù)結(jié)構(gòu),數(shù)學(xué)和圖論
設(shè)計(jì)模式,數(shù)據(jù)庫,計(jì)算機(jī)網(wǎng)絡(luò),操作系統(tǒng),計(jì)算機(jī)組成原理
Python爬蟲、深度學(xué)習(xí)、機(jī)器學(xué)習(xí)
計(jì)算機(jī)系408考研的所有專業(yè)課內(nèi)容
目前還在更新中,先關(guān)注不迷路。微信公眾號,cnblogs(博客園),CSDN同名“風(fēng)骨散人”
如果有什么想看的,可以私信我,如果在能力范圍內(nèi),我會(huì)發(fā)布相應(yīng)的博文!
感謝大家的閱讀!😘你的點(diǎn)贊、收藏、關(guān)注是對我最大的鼓勵(lì)!
總結(jié)
以上是生活随笔為你收集整理的『设计模式』写代码偷懒小技巧,程序开发大智慧--享元模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 又又又融资1.35亿美元!贾跃亭喊话:F
- 下一篇: 『设计模式』我能进来坐坐吗?--访问者模