1. 程式人生 > >【JAVA設計模式】12.享元模式

【JAVA設計模式】12.享元模式

享元模式將物件資訊分為兩類,一個是不受物件具體資訊影響,即可共享的物件資訊,另一個是不同物件間獨立的資訊。

由於存在可共享的資訊,則可設計一個工廠類,工廠類內部儲存了大量物件,所有物件都有一個共同的資訊,例如:產品類別。

先建立一個享元介面:

interface Flyweight {
    /**
     * 對物件外蘊狀態進行賦值操作
     *
     * @param extrinsicState 外蘊狀態
     */
    void operation(int extrinsicState);

    /**
     * 顯示物件內部資訊
     */
    void display();
}

具體實現類:

class ConcreteFlyweight implements Flyweight {

    private int intrinsicState;

    private int extrinsicState;

    ConcreteFlyweight() {
        intrinsicState = 1;
        extrinsicState = 1;
    }

    @Override
    public void operation(int extrinsicState) {
        this.extrinsicState = extrinsicState;
    }

    @Override
    public void display() {
        System.out.println("intrinsicState: " + intrinsicState);
        System.out.println("extrinsicState: " + extrinsicState);
    }
}

其中intrinsicState即內蘊狀態,即物件不可通過外部改變的資訊,為共享資訊,在物件生成時就已經定下。

extrinsicState即外蘊狀態,即可以通過外部方法(本例中“operation”方法)改變的資訊,為不共享資訊。

享元工廠類:

class FlyweightFactory {
    private static HashMap<Integer, Flyweight> flyweights = new HashMap<>();

    static Flyweight getFlyweight(int key) {
        Flyweight flyweight = flyweights.get(key);
        if (flyweight == null) {
            flyweight = new ConcreteFlyweight();
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }
}

getFlyweight方法類似單例模式,都是從容器中取出,所以單例模式也是特殊的享元模式,其內部只有一個物件共享。