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