快速上手設計模式11 - 享元模式
阿新 • • 發佈:2018-12-18
享元模式概念:使用共享物件進而有效地支援大量的細粒度的物件
首先理解兩個概念:內部狀態、外部狀態
內部狀態:在享元物件內部不隨外界環境改變而改變的共享部分。
外部狀態:隨著環境的改變而改變,不能夠共享的狀態就是外部狀態。
都不懂,很簡單:現在有一個畫圖軟體,能畫出各種顏色的圓形。我們就可以把圓形作為享元物件,顏色就作為內部狀態是可以共享的。
首先建立享元類,圓形
public class Circle {
/* 顏色 */
String color;
public Circle(String color) {
this .color = color;
}
public void draw() {
System.out.println("畫出 " + color + " 的圓形");
}
}
接著建立共享池,通常和工廠模式共用,如果共享池裡面存在需要的物件,就從共享池裡面取,否則就建立物件,同時放到共享池裡面。
public class CircleFactory {
/** 通常用hashMap作為享元池儲存物件 */
static final HashMap<String, Circle> circleMap = new HashMap<>();
public static Circle getCircle(String color) {
Circle circle = (Circle) circleMap.get(color);
if (circle == null) {
circle = new Circle(color);
circleMap.put(color, circle);
}
return circle;
}
}
客戶端
Circle circle1 = CircleFactory.getCircle("紅色" );
circle1.draw();
Circle circle2 = CircleFactory.getCircle("白色");
circle2.draw();
Circle circle3 = CircleFactory.getCircle("藍色");
circle3.draw();
Circle circle4 = CircleFactory.getCircle("紅色");
circle4.draw();
Circle circle5 = CircleFactory.getCircle("白色");
circle5.draw();
System.out.println("共享池裡面共有" + CircleFactory.circleMap.size() + "個物件");
輸出結果
畫出 紅色 的圓形
畫出 白色 的圓形
畫出 藍色 的圓形
畫出 紅色 的圓形
畫出 白色 的圓形
共享池裡面共有3個物件
可以看到,我們共畫了5個圓形,可工廠其實只建立了3個物件,因為相同顏色的圓形已經在共享池裡面存在了。
享元模式的核心就是利用hashMap作為共享池,把可以共享的物件都放到裡面,之後在使用到相同的物件時就不需要重新建立物件,只需要從共享池裡面獲取就可以了,極大的減少了記憶體的佔用和資源的消耗。
總結:
1. 享元模式適合系統中存在大量的物件,並且這些物件存在一定的相同或相似的元素(內部狀態)
2. 享元模式通常和工廠模式一起使用,大大減少物件的建立,降低系統的記憶體,使效率提高。
3. 享元模式最主要的特點是存在一個共享池,java中的String型別和jdbc資料庫連線池都是採用的享元模式。