享元模式在主流的標準里是放到結構大類下的,但是我感覺這個模式的最終作用也是為了獲取一個類,所以我將其劃分到創建大類下。 # What is Flyweight Pattern Flyweight 是指輕量級的。 享元模式旨在支持大量細粒度的對象共用,以減少記憶體消耗。該模式通過共用相似對象的部分狀態, ...
享元模式在主流的標準里是放到結構大類下的,但是我感覺這個模式的最終作用也是為了獲取一個類,所以我將其劃分到創建大類下。
What is Flyweight Pattern
Flyweight 是指輕量級的。
享元模式旨在支持大量細粒度的對象共用,以減少記憶體消耗。該模式通過共用相似對象的部分狀態,來減少對象的數量。通過共用,可以節省記憶體並提高系統的性能。
享元模式通常涉及兩個關鍵概念:
- 內部狀態(Intrinsic State)
內部狀態是可以共用的部分,存儲在享元對象內部; - 外部狀態(Extrinsic State)
外部狀態是不可共用的部分,需要在使用時提供。
通過將內部狀態與外部狀態分離,可以實現對象的共用。享元模式適用於需要創建大量相似對象且記憶體消耗較大的場景。
Think:
這個模式給我最大的啟發就是,一些大量且要耗費大量資源,即使它本身是一個整體,也要考慮繼續將它細分,更細粒度的管控它。
Comparison between prototype and Flyweight
Similarities:
- 從場景上來看都是為了節省資源區創建大量相似的對象;
- 一般都是配合工廠模式;
Differences:
- Flyweight 如果需要創建不同的對象,就得提供不同的外部狀態;
- Prototype 無需依賴於顯式的構造函數,它通過複製現有對象的原型來創建新對象。
Key elements
細顆粒類
介面細顆粒類
實現- 創建
細顆粒類
工廠 - Client
Simple Example
當你使用享元模式時,你需要定義一個享元工廠(Flyweight Factory),它負責創建和管理享元對象。下麵是一個簡單的Java代碼示例,演示瞭如何實現享元模式:
首先,我們定義享元介面(Flyweight):
public interface Flyweight {
void operation();
}
然後,實現具體的享元類(ConcreteFlyweight):
public class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation() {
System.out.println("ConcreteFlyweight: " + intrinsicState);
}
}
接下來,創建享元工廠類(FlyweightFactory)來管理享元對象:
import java.util.HashMap;
import java.util.Map;
public class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<>();
public Flyweight getFlyweight(String key) {
if (flyweights.containsKey(key)) {
return flyweights.get(key);
} else {
Flyweight flyweight = new ConcreteFlyweight(key);
flyweights.put(key, flyweight);
return flyweight;
}
}
}
最後,我們可以使用享元工廠來獲取享元對象並調用其方法:
public class Main {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight1 = factory.getFlyweight("A");
flyweight1.operation();
Flyweight flyweight2 = factory.getFlyweight("B");
flyweight2.operation();
Flyweight flyweight3 = factory.getFlyweight("A");
flyweight3.operation();
// 輸出結果:
// ConcreteFlyweight: A
// ConcreteFlyweight: B
// ConcreteFlyweight: A
}
}
在上述示例中,我們使用享元工廠來獲取享元對象。首次獲取某個享元對象時,工廠會創建一個新的對象並將其存儲在內部的HashMap中。之後,如果再次請求相同的享元對象,則直接返回已經創建的對象。這樣就實現了對象的共用,減少了記憶體消耗。
希望這個簡單的示例能幫助你理解享元模式的基本概念和用法。