首頁 > 軟體

Java享元設計模式優化物件建立提高效能和效率

2023-09-05 18:04:56

介紹

Java中的享元模式(Flyweight Pattern)是一種結構型設計模式,旨在通過共用盡可能多的物件來減少記憶體佔用和提高效能.

Java享元模式通常包含以下4種角色

  • 享元工廠(Flyweight Factory):負責建立和管理享元物件.
  • 具體享元(Concrete Flyweight):實現享元介面並儲存與共用狀態相關的內部狀態.
  • 抽象享元(Flyweight):定義享元物件需要實現的介面或抽象類.
  • 非共用狀態(Unshared State):儲存享元物件的非共用狀態.

注意:抽象享元和非共用狀態角色是可選的,可以省略它們將其功能合併到其他角色中

當用戶端請求建立或存取一個享元物件時,享元工廠會檢查是否已經建立了該物件.如果已經建立,則返回現有物件的參照;如果尚未建立,則建立新的物件並返回其參照.這樣使用者端可以共用現有物件,而不必建立新的物件,從而減少記憶體佔用和提高效能.

實現

以電商中的商品資訊為例,在電商中,每個商品都有一個名稱,價格,庫存等屬性.通常情況下,每個商品都需要單獨建立一個物件,這樣會導致記憶體佔用增加,而且如果多次購買相同的商品,系統會建立多個相同的物件,浪費資源.

抽象享元

public interface Product {
    String getName();
    double getPrice();
    int getStock();
}

具體享元

public class ConcreteProduct implements Product{
    private String name;
    private double price;
    private int stock;
    public ConcreteProduct(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public double getPrice() {
        return price;
    }
    @Override
    public int getStock() {
        return stock;
    }
}

享元工廠

public class ProductFactory {
    private static Map<String, Product> productMap = new HashMap<>();
    public static Product getProduct(String name, double price, int stock) {
        String key = name + "_" + price;
        Product res = productMap.get(key);
        if (Objects.isNull(res)) {
            // 如果快取池內不存在,就建立新物件放置到快取池
            res = new ConcreteProduct(name, price, stock);
            productMap.put(key, res);
        }
        return res;
    }
}

測試

public class Demo {
    public static void main(String[] args) {
        Product p1 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
        Product p2 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
        System.out.println(p1 == p2);
    }
}

在上面範例程式碼中,首先建立一個商品介面Product,其中包含了商品的名稱,價格,庫存等屬性.然後建立具體的商品類ConcreteProduct,實現Product介面,並定義共用的內部狀態name,price,和stock.接下來我們建立商品工廠ProductFactory,用於建立和管理共用的商品物件,在這個工廠中,我們使用HashMap來儲存共用的商品物件,每當使用者端需要購買一個商品時,我們先檢查是否已經建立了該商品物件,如果已經建立,則返回現有物件的參照,如果未建立,則建立新的物件儲存到HashMap並返回其參照.

總結

優點

  • 減少物件的建立,節省記憶體空間,提高系統效能.
  • 通過共用物件,可以使得系統中的相同物件在記憶體中只存在一份,從而減少記憶體的開銷.
  • 提高系統的可延伸性,如果需要增加新的物件,只需要在工廠中建立即可,不需要修改原有程式碼.
  • 提高系統的安全性,共用物件是唯讀的,不會被修改.

缺點

  • 可能會使得系統變得過於複雜,增加了程式碼的複雜性.
  • 需要額外的工作來維護共用物件的一致性,比如需要考慮執行緒安全等問題.
  • 可能會因為共用物件的存在而降低程式的靈活性,比如無法對共用物件進行個性化設定.

應用場景

  • 當系統中存在大量相同或相似的物件時,可以考慮使用享元模式來減少記憶體開銷.
  • 當需要快取物件並且可以複用時,也可以考慮使用享元模式.
  • 在多執行緒環境下,可以使用享元模式來實現物件的共用,提高程式的並行效能.
  • 在遊戲開發中,可以使用享元模式來管理遊戲中的角色等物件.

到此這篇關於Java享元設計模式優化物件建立提高效能和效率的文章就介紹到這了,更多相關Java享元設計模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com