今天千鋒Java培訓老師給大家分享一篇教程,Java設(shè)計模式中的享元模式。享元模式有點類似于單例模式,都是只生成一個對象被共享使用。享元模式主要目的就是讓多個對象實現(xiàn)共享,減少不必要的內(nèi)存消耗,將多對同一對象的訪問集中起來,不必為每個訪問者創(chuàng)建一個單獨的對象,以此來降低內(nèi)存的消耗。
1、享元模式結(jié)構(gòu)圖
因為享元模式結(jié)構(gòu)比較復(fù)雜,一般結(jié)合工廠模式一起使用,在它的結(jié)構(gòu)圖中包含了一個享元工廠類。
在享元模式結(jié)構(gòu)圖中包含如下幾個角色:
Flyweight(抽象享元類):通常是一個接口或抽象類,在抽象享元類中聲明了具體享元類公共的方法,這些方法可以向外界提供享元對象的內(nèi)部數(shù)據(jù)(內(nèi)部狀態(tài)),同時也可以通過這些方法來設(shè)置外部數(shù)據(jù)(外部狀態(tài))。
ConcreteFlyweight(具體享元類):它實現(xiàn)了抽象享元類,其實例稱為享元對象;在具體享元類中為內(nèi)部狀態(tài)提供了存儲空間。通常我們可以結(jié)合單例模式來設(shè)計具體享元類,為每一個具體享元類提供唯一的享元對象。
UnsharedConcreteFlyweight(非共享具體享元類):并不是所有的抽象享元類的子類都需要被共享,不能被共享的子類可設(shè)計為非共享具體享元類;當需要一個非共享具體享元類的對象時可以直接通過實例化創(chuàng)建。
FlyweightFactory(享元工廠類):享元工廠類用于創(chuàng)建并管理享元對象,它針對抽象享元類編程,將各種類型的具體享元對象存儲在一個享元池中,享元池一般設(shè)計為一個存儲“鍵值對”的集合(也可以是其他類型的集合),可以結(jié)合工廠模式進行設(shè)計;當用戶請求一個具體享元對象時,享元工廠提供一個存儲在享元池中已創(chuàng)建的實例或者創(chuàng)建一個新的實例(如果不存在的話),返回新創(chuàng)建的實例并將其存儲在享元池中。
2、享元模式的實現(xiàn)
在享元模式中引入了享元工廠類,享元工廠類的作用在于提供一個用于存儲享元對象的享元池,當用戶需要對象時,首先從享元池中獲取,如果享元池中不存在,則創(chuàng)建一個新的享元對象返回給用戶,并在享元池中保存該新增對象。接下來,實現(xiàn)一個登陸的享元模式。
3、享元模式的優(yōu)缺點
享元模式優(yōu)點,在于外部狀態(tài)相對獨立,使得對象可以在不同的環(huán)境中被復(fù)用(共享對象可以適應(yīng)不同的外部環(huán)境)。且享元模式可共享相同或相似的細粒度對象,從而減少了內(nèi)存消耗,同時降低了對象創(chuàng)建與垃圾回收的開銷。
享元模式缺點,外部狀態(tài)由客戶端保存,共享對象讀取外部狀態(tài)的開銷可能比較大。享元模式要求將內(nèi)部狀態(tài)與外部狀態(tài)分離,這使得程序的邏輯復(fù)雜化,同時也增加了狀態(tài)維護成本。
千鋒有全國一體化就業(yè)指導和課程教學能力的專業(yè)it學校,幾年之間已經(jīng)為社會培養(yǎng)了20000多名優(yōu)質(zhì)的學員,同期的在校學生有5000余人,全國在16個大大小小的城市都有分校,而且無差別教學,全國均可以就業(yè),不用因為地域的限制,而找不到好工作了。千鋒作為中國軟件協(xié)會教育指定的優(yōu)質(zhì)培訓學院值得你來。
選擇千鋒Java培訓機構(gòu)是明智之舉。千鋒Java培訓課程內(nèi)容不斷更新升級,讓學生學到更加貼合企業(yè)需求和項目應(yīng)用的一些高端技術(shù),勢必能進一步提高學生競爭力,為學員的高薪就業(yè)以及未來的發(fā)展保駕護航!