最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

介紹

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

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

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

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

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

實(shí)現(xiàn)

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

抽象享元

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)建新對(duì)象放置到緩存池
            res = new ConcreteProduct(name, price, stock);
            productMap.put(key, res);
        }
        return res;
    }
}

測(cè)試

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)建一個(gè)商品接口Product,其中包含了商品的名稱,價(jià)格,庫(kù)存等屬性.然后創(chuàng)建具體的商品類ConcreteProduct,實(shí)現(xiàn)Product接口,并定義共享的內(nèi)部狀態(tài)name,price,和stock.接下來(lái)我們創(chuàng)建商品工廠ProductFactory,用于創(chuàng)建和管理共享的商品對(duì)象,在這個(gè)工廠中,我們使用HashMap來(lái)儲(chǔ)存共享的商品對(duì)象,每當(dāng)客戶端需要購(gòu)買一個(gè)商品時(shí),我們先檢查是否已經(jīng)創(chuàng)建了該商品對(duì)象,如果已經(jīng)創(chuàng)建,則返回現(xiàn)有對(duì)象的引用,如果未創(chuàng)建,則創(chuàng)建新的對(duì)象儲(chǔ)存到HashMap并返回其引用.

總結(jié)

優(yōu)點(diǎn)

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

缺點(diǎn)

  • 可能會(huì)使得系統(tǒng)變得過(guò)于復(fù)雜,增加了代碼的復(fù)雜性.
  • 需要額外的工作來(lái)維護(hù)共享對(duì)象的一致性,比如需要考慮線程安全等問(wèn)題.
  • 可能會(huì)因?yàn)楣蚕韺?duì)象的存在而降低程序的靈活性,比如無(wú)法對(duì)共享對(duì)象進(jìn)行個(gè)性化設(shè)置.

應(yīng)用場(chǎng)景

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

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

相關(guān)文章

  • Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的定時(shí)器代碼解析

    Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的定時(shí)器代碼解析

    這篇文章主要介紹了Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的定時(shí)器代碼解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java遞歸 遍歷目錄的小例子

    Java遞歸 遍歷目錄的小例子

    Java遞歸 遍歷目錄的小例子,需要的朋友可以參考一下
    2013-03-03
  • Java多線程并發(fā)編程 并發(fā)三大要素

    Java多線程并發(fā)編程 并發(fā)三大要素

    這篇文章主要介紹了Java多線程并發(fā)編程 并發(fā)三大要素,需要的朋友可以參考下
    2017-05-05
  • MyBatis Log 插件無(wú)法顯示SQL語(yǔ)句的原因解析

    MyBatis Log 插件無(wú)法顯示SQL語(yǔ)句的原因解析

    MyBatis Log是IDEA一款下載量非常高的插件,該插件可以對(duì)控制臺(tái)打印的日志進(jìn)行解析,然后將對(duì)應(yīng)的SQL語(yǔ)句整理并拼接好對(duì)應(yīng)的參數(shù),非常方便。這篇文章給大家介紹MyBatis Log 插件無(wú)法顯示SQL語(yǔ)句的原因,感興趣的朋友跟隨小編一起看看吧
    2020-09-09
  • Java如何給變量取合適的命名

    Java如何給變量取合適的命名

    這篇文章主要介紹了Java如何給變量取合適的命名,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Win10 Java jdk14.0.2安裝及環(huán)境變量配置詳細(xì)教程

    Win10 Java jdk14.0.2安裝及環(huán)境變量配置詳細(xì)教程

    這篇文章主要介紹了Win10 Java jdk14.0.2安裝及環(huán)境變量配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot安全認(rèn)證Security的實(shí)現(xiàn)方法

    SpringBoot安全認(rèn)證Security的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot安全認(rèn)證Security的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • Spring配置文件中parent與abstract的使用

    Spring配置文件中parent與abstract的使用

    這篇文章主要介紹了Spring配置文件中parent與abstract的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中Json解析的方法分析

    Java中Json解析的方法分析

    這篇文章主要介紹了Java中Json解析的方法,結(jié)合實(shí)例形式分析了java針對(duì)json格式數(shù)據(jù)的解析實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • 基于javamelody監(jiān)控springboot項(xiàng)目過(guò)程詳解

    基于javamelody監(jiān)控springboot項(xiàng)目過(guò)程詳解

    這篇文章主要介紹了基于javamelody監(jiān)控springboot項(xiàng)目過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論

依兰县| 绥棱县| 黄梅县| 宜兰县| 公主岭市| 石林| 龙泉市| 紫金县| 民丰县| 太湖县| 上饶市| 鹤峰县| 汾阳市| 禹城市| 贺兰县| 延川县| 尤溪县| 湖北省| 商南县| 内丘县| 新晃| 孟连| 蒲城县| 普洱| 洛川县| 阆中市| 娄烦县| 黑河市| 乐亭县| 两当县| 南投市| 阿坝县| 江孜县| 郸城县| 青冈县| 改则县| 阳新县| 西乌珠穆沁旗| 隆化县| 板桥市| 长岛县|