享元模式里面的享則共享的意思,很明顯就是共享資源,作用也就很明顯運用共享技術(shù)有效地支持大量細(xì)粒度的對象。如果有很多歌完全相同或相似的對象,我們就可以通過共享模式來節(jié)省內(nèi)存。 享元對象能做到的共享的關(guān)鍵是區(qū)分了內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部狀態(tài):可以共享,不會隨環(huán)境變化而改變。外部狀態(tài):不可以共享,會隨環(huán)境變化而改變。共享單車想必大家都很熟悉吧。共享單車其實也是享元模式的體現(xiàn)。單車的顏色,形狀,大小,重量這些是可以共享的就稱之為內(nèi)部狀態(tài),因為這些特征是它們所共有的,不會隨環(huán)境變化而改變。而單車被擺放的位置是不可以共享的則是外部狀態(tài)。 享元模式的參與者有 1.抽象享元角色:給出一個抽象接口,以規(guī)定出所有具體享元角色需要實現(xiàn)的方法。 2.具體享元角色:實現(xiàn)抽象享元角色所規(guī)定出的接口。如果有內(nèi)蘊狀態(tài)的話,必須負(fù)責(zé)為內(nèi)蘊狀態(tài)提供存儲空間。 3.非具體享元角色:并非所有的抽象享元角色子類都需要被共享。抽象享元角色接口使共享成為可能,但它并不強制共享。 4.享元工廠角色:確保合理地共享抽象享元角色。當(dāng)用戶請求一個抽象享元角色時,如果已經(jīng)有了,享元工廠角色就應(yīng)當(dāng)提供這個已有的享元對象;如果系統(tǒng)中沒有一個適當(dāng)?shù)南碓獙ο蟮脑挘碓S角色就應(yīng)當(dāng)創(chuàng)建一個合適的享元對象。 享元模式的優(yōu)點: 1.減少內(nèi)存中對象的數(shù)量 2.相同或相似的對象在內(nèi)存中只存在一份,節(jié)約資源,提高性能。 3.外部狀態(tài)相對獨立,不影響內(nèi)部狀態(tài) 缺點: 1.模式比較復(fù)雜,使應(yīng)用程序的邏輯變得復(fù)雜化 2.為了節(jié)省內(nèi)存,共享內(nèi)部狀態(tài),分理處外部狀態(tài),而讀取外部狀態(tài)使得運行時間變長,犧牲時間換取空間。 抽象享元角色和具體享元角色類
/** * 抽象享元角色 */public interface Bicycle { String color(String color); String shape(); String size(); String weight(); String parkingPosition(ParkingPosition pg); }/** * 內(nèi)部狀態(tài) * 具體享元角色 */class ConcreteBicycle implements Bicycle{PRivate String color; public ConcreteBicycle(String color) { super(); this.color = color;} @Override public String color(String color) { return color; } @Override public String shape() { return "單車的樣式"; } @Override public String size() { return "單車的大小"; } @Override public String weight() { return "單車的重量"; } @Override public String parkingPosition(ParkingPosition pg) { System.out.println("單車顏色為--->"+color); return "停放位置為--->"+pg.getName(); }}非具體享元角色類
/** * 外部狀態(tài) * 非具體享元角色 */public class ParkingPosition {private String name;public ParkingPosition(String name) { super(); this.name = name;}public String getName() { return name;}public void setName(String name) { this.name = name;}}享元工廠角色類
/** *享元工廠角色 */public class BicycleFactory {private static Map<String,Bicycle>bicycleMap = new HashMap<String,Bicycle>();public static Bicycle getBicycle(String color){ if (bicycleMap.get(color)!=null) { return bicycleMap.get(color); }else { Bicycle bicycle = new ConcreteBicycle(color); bicycleMap.put(color, bicycle); return bicycle; }}}測試代碼
Bicycle bicycle1 = BicycleFactory.getBicycle("黃色");Bicycle bicycle2 = BicycleFactory.getBicycle("黃色");System.out.println("bicycle1--->"+bicycle1);System.out.println("bicycle2--->"+bicycle2);System.out.println(bicycle1.parkingPosition(new ParkingPosition("昌平區(qū)")));System.out.println(bicycle2.parkingPosition(new ParkingPosition("朝陽區(qū)")));運行效果截圖
通過運行效果我們可以看到bicycle1 和bicycle2 是同一個對象。到這里享元模式也就結(jié)束了。整個結(jié)構(gòu)型模式也就介紹完了,后期將會繼續(xù)介紹行為模式。
新聞熱點
疑難解答