【JAVA設計模式】12.享元模式
阿新 • • 發佈:2018-12-11
享元模式將物件資訊分為兩類,一個是不受物件具體資訊影響,即可共享的物件資訊,另一個是不同物件間獨立的資訊。
由於存在可共享的資訊,則可設計一個工廠類,工廠類內部儲存了大量物件,所有物件都有一個共同的資訊,例如:產品類別。
先建立一個享元介面:
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方法類似單例模式,都是從容器中取出,所以單例模式也是特殊的享元模式,其內部只有一個物件共享。