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享元設計模式優化物件創建提高效能和效率的詳細內容。更多資訊請關注PHP中文網其他相關文章!