設計模式——享元模式具體解釋

0. 前言

寫在最前面,本人的設計模式類博文,建議先看博文前半部分的理論介紹。再看后半部分的實例分析。最后再返回來復習一遍理論介紹,這時候你就會發現我在重點處標紅的用心,對于幫助你理解設計模式有奇效哦~本文原創。轉載請注明出處為SEU_Calvin的博客

春運買火車票是一件瘋狂的事情。同一時刻會有大量的查票請求涌向server。server必須做出應答來滿足我們的購票需求。試想。這些請求包括著大量的反復,比方A地到B的車票情況。假設每次都反復創建一個車票查詢結果的對象,那么GC任務將很繁重。影響性能,這就用到了我們的享元模式

當然也會有不反復的請求。比方我想購買從A地到B地的高鐵票。而你想買從A地到B地的動車票


1. 享元模式模式介紹

享元模式定義:

享元模式以共享的方式高效地支持大量的細粒度對象。享元模式中僅僅有內部狀態(不會隨環境發生改變)能夠共享,在春運的樣例中代表詳細的A地到B外部狀態(隨環境改變)不可共享,在樣例中代表客戶想購買從A地到B地的高鐵票還是動車票

?

享元模式的使用場景:

假設一個應用程序須要創建大量的類似對象。須要用對象緩沖池時。

?

享元模式包括的角色:


1抽象享元Flyweight:享元對象抽象基類或接口。

2詳細享元ConcreteFlyweight:實現抽象享元類。

3享元工廠FlyweightFactory:享元模式的核心模塊。負責管理享元對象池、創建享元對象,保證享元對象能夠被系統適當地共享

當一個client對象調用一個享元對象的時候。享元工廠角色會檢查系統中是否已經有一個符合要求的享元對象,假設已有,享元工廠角色就提供這個已有的享元對象;假設沒有就創建一個。


2. 享元模式模式實例介紹

通過上面給出的角色類,我們能夠把文章開始時的樣例實現一下,代碼也比較簡單:

/*
*@SEU_Calvin
*@2016/12/31
*/
//抽象享元類
public interface Ticket{//顯示票價。參數為列車類型 
public void showPrice(String type);
}//詳細享元類
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("創建對象查詢"+key);Ticket ticket = new ConcreteTicket(from,to);map.put(key, ticket);return ticket;
}
}
}//使用時
TicketFactory. getTicket("南京","杭州").showPrice("Gaotie");
TicketFactory. getTicket("南京","杭州").showPrice("Dongche");


從上面代碼能夠看出,我們利用了Map避免了大量查詢南京到杭州列車信息相關的ConcreteTicket實例對象的創建。避免了頻繁GC的發生。

從輸出結果也能夠看出第二次查詢即從緩存中獲取到ConcreteTicket對象。

在本例中內部狀態就是從南京到杭州,外部狀態是列車類型和價格,價格會隨著列車類型變化


在JDK中的String的相關屬性也符合了享元模式的實現原則,這就涉及到了常量池的概念,詳細的已經在從JVM角度比較equals和==的差別一文中介紹過了。感興趣的同學能夠參考。


3. 享元模式的優缺點比較

享元模式的長處:

享元模式大幅度地減少內存中對象的數量,提高了程序的性能。

?享元模式的缺點:

1)為了使對象能夠共享。須要將一些狀態外部化,這使得程序的邏輯復雜化。

2)享元模式須要額外維護對象緩存池。



轉載于:https://www.cnblogs.com/lytwajue/p/7395750.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282638.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenStack Nova計算服務管理(四)

作者&#xff1a;李曉輝聯系方式: Xiaohui_lifoxmail.com環境介紹類型控制節點和計算節點等在一起&#xff0c;形成all-in-one內存8G硬盤200G網卡2塊計算服務概覽使用OpenStack計算服務來托管和管理云計算系統。OpenStack計算服務是基礎設施即服務(IaaS)系統的主要部分&#xf…

miui替換官方文件解決無服務器,miui 關掉云服務器

miui 關掉云服務器 內容精選換一換本節操作介紹Linux云服務器切換密鑰登錄為密碼登錄的操作步驟。使用密鑰登錄Linux云服務器&#xff0c;設置root密碼。sudo passwd root若密鑰文件丟失或損壞&#xff0c;請參考Linux云服務器如何進入單用戶模式重置root密碼&#xff0c;重置r…

PHP-高并發和大流量的解決方案

一 高并發的概念 在互聯網時代&#xff0c;并發&#xff0c;高并發通常是指并發訪問。也就是在某個時間點&#xff0c;有多少個訪問同時到來。 二 高并發架構相關概念 1、QPS (每秒查詢率) : 每秒鐘請求或者查詢的數量&#xff0c;在互聯網領域&#xff0c;指每秒響應請求數…

原型

2019獨角獸企業重金招聘Python工程師標準>>> 什么是原型&#xff1a; 對象與對象之間的關系 轉載于:https://my.oschina.net/u/2285087/blog/854377

JavaScript中數組slice和splice的對比小結

前言 今天重溫了一下Javascript&#xff0c;看到了數組的方法&#xff0c;其中有兩個比較相似的方法——splice和splice&#xff0c;看著很像&#xff0c;就是多了一個p&#xff0c;但是用法卻相當不一樣。 在使用中&#xff0c;可以通過選擇一個具有強語義表達性的 API 來減少…

存儲服務器的操作系統,存儲服務器是什么操作系統

存儲服務器是什么操作系統 內容精選換一換鏡像服務提供了私有鏡像的全生命周期管理能力&#xff0c;主要包括創建私有鏡像&#xff0c;復制、共享或導出私有鏡像等操作&#xff0c;您可以根據實際場景選擇合適的方法&#xff0c;并結合彈性云服務器、對象存儲等周邊服務完成業務…

優化--減少HTTP請求

一、 圖片地圖 (將幾張圖片合為一張,根據用戶點擊的位置發送不同請求,減少了圖片的請求數量) 案例所在位置:http://stevesouders.com/hpws/imagemap.php 二、css精靈(和圖片地圖功能相似,都是將幾張圖片合并在一起,根據位置發送不同請求) 這里不做具體使用介紹,百度有此方面內…

軟件負載均衡

一、軟件負載均衡概述 硬件負載均衡性能優越&#xff0c;功能全面&#xff0c;但是價格昂貴&#xff0c;一般適合初期或者土豪級公司長期使用。因此軟件負載均衡在互聯網領域大量使用。常用的軟件負載均衡軟件有Nginx&#xff0c;Lvs&#xff0c;HaProxy等。本文參考大量文檔&a…

JAVA多線程之先行發生原則

一、引子   如果java內存模型中所有的有序性都僅僅依靠volatile和synchronized來完成&#xff0c;那么有一些操作會變得很繁瑣&#xff0c;但我們在編寫java并發代碼時并未感覺到這一點&#xff0c;這是因為java語言中有個先行發生原則&#xff08;happens-before&#xff09…

git工具 將源碼clone到本地指定目錄的三種方式

git工具 將源碼clone到本地指定目錄的三種方式 CreationTime--2018年7月27日15點34分 Author:Marydon 1.情景展示 運行git-bash.exe&#xff0c;輸入命令&#xff1a;git clone 下載源碼地址-->回車&#xff0c;結果發現項目被下載到了&#xff0c;git工具的安裝目錄下 如何…

[摘]全文檢索引擎Solr系列—–全文檢索基本原理

原文鏈接--http://www.importnew.com/12707.html 全文檢索引擎Solr系列—–全文檢索基本原理 2014/08/18 | 分類&#xff1a; 基礎技術, 教程 | 2 條評論 | 標簽&#xff1a; solr 分享到&#xff1a; 64 本文作者&#xff1a; ImportNew - 劉志軍 未經許可&#xff0c;禁止轉載…

優化-瀏覽器緩存和壓縮優化

一、減少HTTP請求 1.圖片地圖&#xff1a; 假設導航欄上有五幅圖片&#xff0c;點擊每張圖片都會進入一個鏈接&#xff0c;這樣五張導航的圖片在加載時會產生5個HTTP請求。然而&#xff0c;使用一個圖片地圖可以提高效率&#xff0c;這樣就只需要一個HTTP請求。 服務器端圖片…

匯新杯┃拼多多黃崢:普通的創業者,不普通的朋友圈_創成匯

本月26日晚&#xff0c;拼多多在美國納斯達克上市&#xff0c;開盤后便持續走高&#xff0c;收漲高達40.53%&#xff0c;這家從成立到上市不過短短2年10個月的企業&#xff0c;是近四年來最大中概股IPO。拼多多創始人黃崢身家一夜暴漲到138.5億美元。在拼多多之前&#xff0c;黃…

NCC CAP 6.2 版本正式發布

原文&#xff1a;https://www.cnblogs.com/savorboard/p/cap-6-2.html作者&#xff1a;楊曉東前言今天&#xff0c;我們很高興宣布 CAP 發布 6.2 版本正式版&#xff0c;在這個版本中我們主要做了一些功能優化&#xff0c;以及針對目前已經發現的幾個 BUG 進行了修復了。那么&a…

pdksh 包

安裝oracle gi&#xff0c;rac 時經常會碰到 pdksh 的檢測失敗&#xff0c;可以從這個網站下載需要的包 http://rpm.pbone.net/ rpm -q ksh-* rpm -e ksh-* rpm -ivh ./pdksh* 或者參考 Requirements for Installing Oracle 11gR2 RDBMS on RHEL6 or OL6 64-bit (x86-64) (文…

sysctl.conf工作原理

2019獨角獸企業重金招聘Python工程師標準>>> sysctl.conf工作原理 sysctl命令被用于在內核運行時動態地修改內核的運行參數&#xff0c;可用的內核參數在目錄/proc/sys中。它包含一些TCP/IP堆棧和虛擬內存系統的高級選項&#xff0c; 這可以讓有經驗的管理員提高引人…

CDN加速

一、CDN的概念 全稱是Content Delivery Network&#xff0c;即內容分發網絡。 其基本思路是: 盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節&#xff0c;使內容傳輸的更快、更穩定。 通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智…

修復刪除/var/lib/dpkg目錄后,無法使用apt-get命令問題

2019獨角獸企業重金招聘Python工程師標準>>> Unfortunately Ive deleted dpkg directory while removing the lock. By mistake I typed rootsam:~$ rm -r /var/lib/dpkgNow when I am trying to install/uninstall packages it shows me following error. E: Could…

動態加載vs靜態加載

動態加載&#xff1a; 1&#xff1a;靈活&#xff0c;可以在需要的時候用LoadLibrary進行加載&#xff0c;在不需要的時候用FreeLibrary進行卸載&#xff0c;這樣可以不必占用內存。2&#xff1a;可以在沒有dll時候發現&#xff0c;而不致程序報錯。3&#xff1a;加載程序中有條…

Webpack前端打包工具

一、安裝 安裝Webpack之前需要安裝nodejs&#xff0c;然后用npm安裝: $ npm install webpack -g &nsbp;運行以上命令就將Webpack安裝到了全局環境中。 但是通常我們會將Webpack只安裝到項目的依賴中: $ cd /www/webpack_demo1 // 進入項目目錄&#xff0c;確保該目錄…