享元模式里面的享則共享的意思,很明顯就是共享資源,作用也就很明顯運用共享技術有效地支持大量細粒度的對象。如果有很多歌完全相同或相似的對象,我們就可以通過共享模式來節省內存。 享元對象能做到的共享的關鍵是區分了內部狀態和外部狀態。內部狀態:可以共享,不會隨環境變化而改變。外部狀態:不可以共享,會隨環境變化而改變。共享單車想必大家都很熟悉吧。共享單車其實也是享元模式的體現。單車的顏色,形狀,大小,重量這些是可以共享的就稱之為內部狀態,因為這些特征是它們所共有的,不會隨環境變化而改變。而單車被擺放的位置是不可以共享的則是外部狀態。 享元模式的參與者有 1.抽象享元角色:給出一個抽象接口,以規定出所有具體享元角色需要實現的方法。 2.具體享元角色:實現抽象享元角色所規定出的接口。如果有內蘊狀態的話,必須負責為內蘊狀態提供存儲空間。 3.非具體享元角色:并非所有的抽象享元角色子類都需要被共享。抽象享元角色接口使共享成為可能,但它并不強制共享。 4.享元工廠角色:確保合理地共享抽象享元角色。當用戶請求一個抽象享元角色時,如果已經有了,享元工廠角色就應當提供這個已有的享元對象;如果系統中沒有一個適當的享元對象的話,享元工廠角色就應當創建一個合適的享元對象。 享元模式的優點: 1.減少內存中對象的數量 2.相同或相似的對象在內存中只存在一份,節約資源,提高性能。 3.外部狀態相對獨立,不影響內部狀態 缺點: 1.模式比較復雜,使應用程序的邏輯變得復雜化 2.為了節省內存,共享內部狀態,分理處外部狀態,而讀取外部狀態使得運行時間變長,犧牲時間換取空間。 抽象享元角色和具體享元角色類
/** * 抽象享元角色 */public interface Bicycle { String color(String color); String shape(); String size(); String weight(); String parkingPosition(ParkingPosition pg); }/** * 內部狀態 * 具體享元角色 */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(); }}非具體享元角色類
/** * 外部狀態 * 非具體享元角色 */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("昌平區")));System.out.println(bicycle2.parkingPosition(new ParkingPosition("朝陽區")));運行效果截圖 通過運行效果我們可以看到bicycle1 和bicycle2 是同一個對象。到這里享元模式也就結束了。整個結構型模式也就介紹完了,后期將會繼續介紹行為模式。
新聞熱點
疑難解答