欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java享元設(shè)計模式優(yōu)化對象創(chuàng)建提高性能和效率

 更新時間:2023年04月22日 09:06:21   作者:.番茄炒蛋  
Java享元設(shè)計模式通過共享可重用的對象,減少了系統(tǒng)中對象的數(shù)量,優(yōu)化了對象的創(chuàng)建和管理,提高了性能和效率。它是一種經(jīng)典的設(shè)計模式,適用于需要處理大量相似對象的應(yīng)用程序

介紹

Java中的享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計模式,旨在通過共享盡可能多的對象來減少內(nèi)存占用和提高性能.

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

  • 享元工廠(Flyweight Factory):負(fù)責(zé)創(chuàng)建和管理享元對象.
  • 具體享元(Concrete Flyweight):實現(xiàn)享元接口并存儲與共享狀態(tài)相關(guān)的內(nèi)部狀態(tài).
  • 抽象享元(Flyweight):定義享元對象需要實現(xiàn)的接口或抽象類.
  • 非共享狀態(tài)(Unshared State):儲存享元對象的非共享狀態(tài).

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

當(dāng)客戶端請求創(chuàng)建或訪問一個享元對象時,享元工廠會檢查是否已經(jīng)創(chuàng)建了該對象.如果已經(jīng)創(chuàng)建,則返回現(xiàn)有對象的引用;如果尚未創(chuàng)建,則創(chuàng)建新的對象并返回其引用.這樣客戶端可以共享現(xiàn)有對象,而不必創(chuàng)建新的對象,從而減少內(nèi)存占用和提高性能.

實現(xiàn)

以電商中的商品信息為例,在電商中,每個商品都有一個名稱,價格,庫存等屬性.通常情況下,每個商品都需要單獨創(chuàng)建一個對象,這樣會導(dǎo)致內(nèi)存占用增加,而且如果多次購買相同的商品,系統(tǒng)會創(chuàng)建多個相同的對象,浪費資源.

抽象享元

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)) {
            // 如果緩存池內(nèi)不存在,就創(chuàng)建新對象放置到緩存池
            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);
    }
}

在上面示例代碼中,首先創(chuàng)建一個商品接口Product,其中包含了商品的名稱,價格,庫存等屬性.然后創(chuàng)建具體的商品類ConcreteProduct,實現(xiàn)Product接口,并定義共享的內(nèi)部狀態(tài)name,price,和stock.接下來我們創(chuàng)建商品工廠ProductFactory,用于創(chuàng)建和管理共享的商品對象,在這個工廠中,我們使用HashMap來儲存共享的商品對象,每當(dāng)客戶端需要購買一個商品時,我們先檢查是否已經(jīng)創(chuàng)建了該商品對象,如果已經(jīng)創(chuàng)建,則返回現(xiàn)有對象的引用,如果未創(chuàng)建,則創(chuàng)建新的對象儲存到HashMap并返回其引用.

總結(jié)

優(yōu)點

  • 減少對象的創(chuàng)建,節(jié)省內(nèi)存空間,提高系統(tǒng)性能.
  • 通過共享對象,可以使得系統(tǒng)中的相同對象在內(nèi)存中只存在一份,從而減少內(nèi)存的開銷.
  • 提高系統(tǒng)的可擴展性,如果需要增加新的對象,只需要在工廠中創(chuàng)建即可,不需要修改原有代碼.
  • 提高系統(tǒng)的安全性,共享對象是只讀的,不會被修改.

缺點

  • 可能會使得系統(tǒng)變得過于復(fù)雜,增加了代碼的復(fù)雜性.
  • 需要額外的工作來維護共享對象的一致性,比如需要考慮線程安全等問題.
  • 可能會因為共享對象的存在而降低程序的靈活性,比如無法對共享對象進行個性化設(shè)置.

應(yīng)用場景

  • 當(dāng)系統(tǒng)中存在大量相同或相似的對象時,可以考慮使用享元模式來減少內(nèi)存開銷.
  • 當(dāng)需要緩存對象并且可以復(fù)用時,也可以考慮使用享元模式.
  • 在多線程環(huán)境下,可以使用享元模式來實現(xiàn)對象的共享,提高程序的并發(fā)性能.
  • 在游戲開發(fā)中,可以使用享元模式來管理游戲中的角色等對象.

到此這篇關(guān)于Java享元設(shè)計模式優(yōu)化對象創(chuàng)建提高性能和效率的文章就介紹到這了,更多相關(guān)Java享元設(shè)計模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java基于TCP協(xié)議實現(xiàn)聊天程序

    java基于TCP協(xié)議實現(xiàn)聊天程序

    這篇文章主要為大家詳細(xì)介紹了java基于TCP協(xié)議實現(xiàn)聊天程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Spring boot測試找不到SpringRunner.class的問題

    Spring boot測試找不到SpringRunner.class的問題

    這篇文章主要介紹了Spring boot測試找不到SpringRunner.class的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • JDK環(huán)境變量配置的具體操作步驟

    JDK環(huán)境變量配置的具體操作步驟

    本篇文章介紹了,JDK環(huán)境變量配置的具體操作步驟。需要的朋友參考下
    2013-05-05
  • Java之JSF框架案例詳解

    Java之JSF框架案例詳解

    這篇文章主要介紹了Java之JSF框架案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Spring + Spring Boot + MyBatis + MongoDB的整合教程

    Spring + Spring Boot + MyBatis + MongoDB的整合教程

    這篇文章主要給大家介紹了關(guān)于Spring + Spring Boot + MyBatis + MongoDB的整合教程,文中通過圖文以及示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-12-12
  • Spring?Cloud?Alibaba?Nacos服務(wù)治理平臺服務(wù)注冊、RestTemplate實現(xiàn)微服務(wù)之間訪問負(fù)載均衡訪問的問題

    Spring?Cloud?Alibaba?Nacos服務(wù)治理平臺服務(wù)注冊、RestTemplate實現(xiàn)微服務(wù)之間訪

    這篇文章主要介紹了Spring?Cloud?Alibaba:Nacos服務(wù)治理平臺,服務(wù)注冊、RestTemplate實現(xiàn)微服務(wù)之間訪問,負(fù)載均衡訪問,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • java編程實現(xiàn)根據(jù)EXCEL列名求其索引的方法

    java編程實現(xiàn)根據(jù)EXCEL列名求其索引的方法

    這篇文章主要介紹了java編程實現(xiàn)根據(jù)EXCEL列名求其索引的方法,涉及Java元素遍歷與數(shù)學(xué)運算的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • java 生成二維碼實例

    java 生成二維碼實例

    這篇文章主要介紹了java 生成二維碼的實例,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Spring容器注入bean的幾種方式詳解

    Spring容器注入bean的幾種方式詳解

    這篇文章主要介紹了Spring容器注入bean的幾種方式詳解,@Configuration用來聲明一個配置類,然后使用 @Bean 注解,用于聲明一個bean,將其加入到Spring容器中,這種方式是我們最常用的一種,需要的朋友可以參考下
    2024-01-01
  • Spring Task定時任務(wù)的實現(xiàn)詳解

    Spring Task定時任務(wù)的實現(xiàn)詳解

    這篇文章主要介紹了SpringBoot定時任務(wù)功能詳細(xì)解析,這次的功能開發(fā)過程中也算是對其內(nèi)涵的進一步了解,以后遇到定時任務(wù)的處理也更清晰,更有效率了,對SpringBoot定時任務(wù)相關(guān)知識感興趣的朋友一起看看吧
    2022-08-08

最新評論