您好,登錄后才能下訂單哦!
這篇“怎么使用Java享元設(shè)計(jì)模式優(yōu)化對(duì)象創(chuàng)建提高性能和效率”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“怎么使用Java享元設(shè)計(jì)模式優(yōu)化對(duì)象創(chuà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)存占用和提高性能.
以電商中的商品信息為例,在電商中,每個(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并返回其引用.
減少對(duì)象的創(chuàng)建,節(jié)省內(nèi)存空間,提高系統(tǒng)性能.
通過(guò)共享對(duì)象,可以使得系統(tǒng)中的相同對(duì)象在內(nèi)存中只存在一份,從而減少內(nèi)存的開(kāi)銷.
提高系統(tǒng)的可擴(kuò)展性,如果需要增加新的對(duì)象,只需要在工廠中創(chuàng)建即可,不需要修改原有代碼.
提高系統(tǒng)的安全性,共享對(duì)象是只讀的,不會(huì)被修改.
可能會(huì)使得系統(tǒng)變得過(guò)于復(fù)雜,增加了代碼的復(fù)雜性.
需要額外的工作來(lái)維護(hù)共享對(duì)象的一致性,比如需要考慮線程安全等問(wèn)題.
可能會(huì)因?yàn)楣蚕韺?duì)象的存在而降低程序的靈活性,比如無(wú)法對(duì)共享對(duì)象進(jìn)行個(gè)性化設(shè)置.
當(dāng)系統(tǒng)中存在大量相同或相似的對(duì)象時(shí),可以考慮使用享元模式來(lái)減少內(nèi)存開(kāi)銷.
當(dāng)需要緩存對(duì)象并且可以復(fù)用時(shí),也可以考慮使用享元模式.
在多線程環(huán)境下,可以使用享元模式來(lái)實(shí)現(xiàn)對(duì)象的共享,提高程序的并發(fā)性能.
在游戲開(kāi)發(fā)中,可以使用享元模式來(lái)管理游戲中的角色等對(duì)象.
以上就是關(guān)于“怎么使用Java享元設(shè)計(jì)模式優(yōu)化對(duì)象創(chuàng)建提高性能和效率”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。