1. 程式人生 > >快速上手設計模式11 - 享元模式

快速上手設計模式11 - 享元模式

享元模式概念:使用共享物件進而有效地支援大量的細粒度的物件

首先理解兩個概念:內部狀態、外部狀態

  • 內部狀態:在享元物件內部不隨外界環境改變而改變的共享部分。

  • 外部狀態:隨著環境的改變而改變,不能夠共享的狀態就是外部狀態。

都不懂,很簡單:現在有一個畫圖軟體,能畫出各種顏色的圓形。我們就可以把圓形作為享元物件,顏色就作為內部狀態是可以共享的。

首先建立享元類,圓形

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資料庫連線池都是採用的享元模式。