1. 程式人生 > >設計模式之享元模式【Flyweight Pattern】

設計模式之享元模式【Flyweight Pattern】

享元模式是物件池的一種實現,用來儘可能減少記憶體使用量,它適合用於可能存在大量重複物件的場景,來快取可共享的物件,達到物件共享、避免建立過多物件的效果。可以提升效能。避免記憶體移除等。

1、定義

使用共享物件可有效地支援大量的細粒度的物件。

2、使用場景

  1. 系統中存在大量相似物件。
  2. 細粒度的物件都具備較接近的外部狀態,並且內部狀態與環境無關。
  3. 需要緩衝池的場景。

3、UML圖

4、程式碼示例

享元類定義

public interface Flyweight {

    // 示意性方法,引數state是外部狀態
    public void doSomething
(String externalState); } public class ConcreteFlyweight implements Flyweight { //內部狀態,初始化後就不變了 private String intrinsicState = null; /** * 建構函式,內部狀態作為引數傳入 * * @param state */ public ConcreteFlyweight(String state) { this.intrinsicState = state; } /** * 外部狀態作為引數傳入方法中,改變方法的行為, 但是並不改變物件的內部狀態。 */
@Override public void doSomething(String externalState) { //具體的功能邏輯,可能會用到享元內部、外部狀態 System.out.println("Intrinsic State = " + this.intrinsicState); System.out.println("External State = " + externalState); } }

享元工廠:

public class FlyweightFactory {

    private Map<String, Flyweight> maps = new
HashMap<String, Flyweight>(); public Flyweight getFlyweight(String state) { // 1、先從快取中查詢物件 Flyweight fly = maps.get(state); // 2、如果物件不存在則建立一個新的享元物件 if (fly == null) { System.out.println("享元物件池沒有,新建立一個物件"); fly = new ConcreteFlyweight(state); // 2.1、 把這個新的享元物件新增到快取中 maps.put(state, fly); } else { System.out.println("在享元物件池找到快取物件,直接返回"); } // 3、返回享元物件 return fly; } }

客戶端呼叫:

public class Client {

    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight fly = factory.getFlyweight("男的");
        fly.doSomething("寫程式碼");

        System.out.print("\n");

        fly = factory.getFlyweight("女的");
        fly.doSomething("做美工圖片");

        System.out.print("\n");

        fly = factory.getFlyweight("男的");
        fly.doSomething("修電腦");
    }
}

呼叫輸出:
這裡寫圖片描述