设计模式——享元模式具体解释
0. 前言
寫在最前面,本人的設(shè)計模式類博文,建議先看博文前半部分的理論介紹。再看后半部分的實例分析。最后再返回來復(fù)習(xí)一遍理論介紹,這時候你就會發(fā)現(xiàn)我在重點處標(biāo)紅的用心,對于幫助你理解設(shè)計模式有奇效哦~本文原創(chuàng)。轉(zhuǎn)載請注明出處為SEU_Calvin的博客。
春運買火車票是一件瘋狂的事情。同一時刻會有大量的查票請求涌向server。server必須做出應(yīng)答來滿足我們的購票需求。試想。這些請求包括著大量的反復(fù),比方從A地到B地的車票情況。假設(shè)每次都反復(fù)創(chuàng)建一個車票查詢結(jié)果的對象,那么GC任務(wù)將很繁重。影響性能,這就用到了我們的享元模式。
當(dāng)然也會有不反復(fù)的請求。比方我想購買從A地到B地的高鐵票。而你想買從A地到B地的動車票。
1. 享元模式模式介紹
享元模式定義:
享元模式以共享的方式高效地支持大量的細(xì)粒度對象。享元模式中僅僅有內(nèi)部狀態(tài)(不會隨環(huán)境發(fā)生改變)能夠共享,在春運的樣例中代表詳細(xì)的從A地到B地,外部狀態(tài)(隨環(huán)境改變)不可共享,在樣例中代表客戶想購買從A地到B地的高鐵票還是動車票。
?
享元模式的使用場景:
假設(shè)一個應(yīng)用程序須要創(chuàng)建大量的類似對象。須要用對象緩沖池時。
?
享元模式包括的角色:
(1)抽象享元Flyweight類:享元對象抽象基類或接口。
(2)詳細(xì)享元ConcreteFlyweight類:實現(xiàn)抽象享元類。
(3)享元工廠FlyweightFactory類:享元模式的核心模塊。負(fù)責(zé)管理享元對象池、創(chuàng)建享元對象,保證享元對象能夠被系統(tǒng)適當(dāng)?shù)?/span>共享。
當(dāng)一個client對象調(diào)用一個享元對象的時候。享元工廠角色會檢查系統(tǒng)中是否已經(jīng)有一個符合要求的享元對象,假設(shè)已有,享元工廠角色就提供這個已有的享元對象;假設(shè)沒有就創(chuàng)建一個。
2. 享元模式模式實例介紹
通過上面給出的角色類,我們能夠把文章開始時的樣例實現(xiàn)一下,代碼也比較簡單:
/* *@SEU_Calvin *@2016/12/31 */ //抽象享元類 public interface Ticket{//顯示票價。參數(shù)為列車類型 public void showPrice(String type); }//詳細(xì)享元類 public class ConcreteTicket implements Ticket { String from; String to; public ConcreteTicket(String from,String to){this.from = from;this.to = to; }@Override public void showPrice(String type){ if(type.equals("Gaotie")){System.out.println("從"+from+"到"+to+"的高鐵票價為200元"); }else{System.out.println("從"+from+"到"+to+"的動車票價為120元"); } } } //享元工廠類 public class TicketFactory{ static Map<String,Ticket> map= new ConcurrentHashMap< String,Ticket >(); public static Ticket getTicket(String from,String to){String key = from+to;if(map.containsKey(key)){System.out.println("使用緩存查詢"+key);return map.get(key); }else{System.out.println("創(chuàng)建對象查詢"+key);Ticket ticket = new ConcreteTicket(from,to);map.put(key, ticket);return ticket; } } }//使用時 TicketFactory. getTicket("南京","杭州").showPrice("Gaotie"); TicketFactory. getTicket("南京","杭州").showPrice("Dongche");從上面代碼能夠看出,我們利用了Map避免了大量查詢南京到杭州列車信息相關(guān)的ConcreteTicket實例對象的創(chuàng)建。避免了頻繁GC的發(fā)生。
從輸出結(jié)果也能夠看出第二次查詢即從緩存中獲取到ConcreteTicket對象。
在本例中內(nèi)部狀態(tài)就是從南京到杭州,外部狀態(tài)是列車類型和價格,價格會隨著列車類型變化。
在JDK中的String類的相關(guān)屬性也符合了享元模式的實現(xiàn)原則,這就涉及到了常量池的概念,詳細(xì)的已經(jīng)在從JVM角度比較equals和==的差別一文中介紹過了。感興趣的同學(xué)能夠參考。
3. 享元模式的優(yōu)缺點比較
享元模式的長處:
享元模式大幅度地減少內(nèi)存中對象的數(shù)量,提高了程序的性能。
?享元模式的缺點:
(1)為了使對象能夠共享。須要將一些狀態(tài)外部化,這使得程序的邏輯復(fù)雜化。
(2)享元模式須要額外維護(hù)對象緩存池。
轉(zhuǎn)載于:https://www.cnblogs.com/lytwajue/p/7395750.html
總結(jié)
以上是生活随笔為你收集整理的设计模式——享元模式具体解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高通 qca9563 ap152
- 下一篇: [转] 【领导必读】唐僧为什么可以领导孙