日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

還在重復(fù)創(chuàng)建對象?快試試通過享元模式減少對象創(chuàng)建

來源: 責(zé)編: 時間:2024-03-21 09:45:51 255觀看
導(dǎo)讀享元模式享元模式是一種結(jié)構(gòu)型設(shè)計模式,旨在通過共享盡可能多的數(shù)據(jù)來最小化內(nèi)存使用和提高性能。在享元模式中,對象被分為內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部狀態(tài)是可以共享的,而外部狀態(tài)是根據(jù)對象的上下文而變化的。在實現(xiàn)享元

享元模式

享元模式是一種結(jié)構(gòu)型設(shè)計模式,旨在通過共享盡可能多的數(shù)據(jù)來最小化內(nèi)存使用和提高性能。在享元模式中,對象被分為內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部狀態(tài)是可以共享的,而外部狀態(tài)是根據(jù)對象的上下文而變化的。lmc28資訊網(wǎng)——每日最新資訊28at.com

在實現(xiàn)享元模式時,通常會創(chuàng)建一個工廠類來管理共享的對象實例,并在需要時返回已存在的實例,而不是創(chuàng)建新的實例。這樣可以減少內(nèi)存占用,并且可以提高系統(tǒng)的性能。lmc28資訊網(wǎng)——每日最新資訊28at.com

應(yīng)用場景

享元模式適用于需要共享大量對象、減少內(nèi)存占用、優(yōu)化性能的場景。lmc28資訊網(wǎng)——每日最新資訊28at.com

  1. 對象的數(shù)量非常大,且占用大量內(nèi)存。通過享元模式可以共享對象,減少內(nèi)存占用。
  2. 對象的大部分狀態(tài)可以外部狀態(tài),而少部分狀態(tài)可以內(nèi)部狀態(tài)。通過享元模式可以將內(nèi)部狀態(tài)和外部狀態(tài)分離,減少對象數(shù)量。
  3. 對象的狀態(tài)可以被多個對象共享。通過享元模式可以將狀態(tài)共享,減少重復(fù)創(chuàng)建對象。
  4. 對象的創(chuàng)建和銷毀頻繁,需要優(yōu)化性能。通過享元模式可以減少對象的創(chuàng)建和銷毀,提高性能。

場景示例

過年回家買火車票是一件很困難的事,無數(shù)人用刷票軟件向服務(wù)端發(fā)出請求,對于每一個請求服務(wù)器都必須做出應(yīng)答。在用戶設(shè)置好出發(fā)地和目的地之后,每次請求都返回一個查詢的車票結(jié)果。為了便于理解,我們假設(shè)每次返回的只有一趟列車的車票。那么當數(shù)以萬計的人不問斷在請求數(shù)據(jù)時,如果每次都重新創(chuàng)建一個查詢的車票結(jié)果,那么必然會造成大量重復(fù)對象的創(chuàng)建、銷毀,使得 GC 任務(wù)繁重、內(nèi)存占用率高居不下。而這類問題通過享元模式就能夠得到很好地改善,從城市 A 到城市 B 的車輛是有限的,車上的鋪位也就是硬臥、硬臥、坐票 3 種。我們將這些可以公用的對象緩存起來,在用戶查詢時優(yōu)先使用緩存,如果沒有緩存則重新創(chuàng)建。這樣就將成千上萬的對象變?yōu)榱丝蛇x擇的有限數(shù)量。lmc28資訊網(wǎng)——每日最新資訊28at.com

首先我們創(chuàng)建一個 Ticket 接口,該接口定義展示車票信息的函數(shù):lmc28資訊網(wǎng)——每日最新資訊28at.com

public interface Ticket {    public void showTicketInfo(String bunk);}

它的一個具體的實現(xiàn)類是 TrainTicket 類:lmc28資訊網(wǎng)——每日最新資訊28at.com

class TrainTicket implements Ticket {    public String from; // 始發(fā)地    public String to; // 目的地    public String bunk; // 鋪位    public int price;    TrainTicket(String from, String to) {        this.from = from;        this.to = to;    }    @Override    public void showTicketInfo(String bunk) {        price = new Random().nextInt(300);        System.out.println("購買 從 " + from + " 到 " + to + "的 "                + bunk + " 火車票" + ", 價格 : " + price);    }}

數(shù)據(jù)庫中表示火車票的信息有出發(fā)地、目的地、鋪位、價格等字段,在購票用戶每次查詢時如果沒有用某種緩存模式,那么返回車票數(shù)據(jù)的接口實現(xiàn)如下:lmc28資訊網(wǎng)——每日最新資訊28at.com

public class TicketFactory {    public static Ticket getTicket(String from, String to) {        return new TrainTicket(from, to);    }}

在 TicketFactory 的 getTicket 函數(shù)中每次會 new 一個 TrainTicket 對象,也就是說如果在短時間內(nèi)有 10000 萬用戶求購北京到杭州的車票,那么北京到杭州的車票對象就會被創(chuàng)建 10000 次,當數(shù)據(jù)返回之后這些對象變得無用了又會被虛擬機回收。此時就會造成大量的重復(fù)對象存在內(nèi)存中,GC 對這些對象的回收也會非常消耗資源。如果用戶的請求量很大可能導(dǎo)致系統(tǒng)變得極其緩慢,甚至可能導(dǎo)致 OOM。正如上文所說,享元模式通過消息池的形式有效地減少了重復(fù)對象的存在。它通過內(nèi)部狀態(tài)標識某個種類的對象,外部程序根據(jù)這個不會變化的內(nèi)部狀態(tài)從消息池中取出對象。使得同一類對象可以被復(fù)用,避免大量重復(fù)對象。lmc28資訊網(wǎng)——每日最新資訊28at.com

使用享元模式很簡單,只需要簡單地改造一下 TicketFactory,具體代碼如下:lmc28資訊網(wǎng)——每日最新資訊28at.com

/** * 車票工廠,以出發(fā)地和目的地為key緩存車票 *  */public class TicketFactory {    static Map<String, Ticket> sTicketMap = new ConcurrentHashMap<String, Ticket>();    public static Ticket getTicket(String from, String to) {        String key = from + "-" + to;        if (sTicketMap.containsKey(key)) {            System.out.println("使用緩存 ==> " + key);            return sTicketMap.get(key);        } else {            System.out.println("創(chuàng)建對象 ==> " + key);            Ticket ticket = new TrainTicket(from, to);            sTicketMap.put(key, ticket);            return ticket;        }    }}

在 TicketFactory 中添加了一個 map 容器,并且以出發(fā)地 + "-" + 日的地為鍵、以車票對象作為值存儲車票對象。這個 map 的鍵就是我們說的內(nèi)部狀態(tài),在這里就是出發(fā)地、橫杠、目的地拼接起來的字符串,如果沒有緩存則創(chuàng)建一個對象,并且將這個對象緩存到 map 中,下次再有這類請求時則直接從緩存中獲取。這樣即使有 10000 個請求北京到杭州的車票信息,那么出發(fā)地是北京、目的地是杭州的車票對象只有一個。這樣就從這個對象從 10000 減到了 1 個,避免了大量的內(nèi)存占用及頻繁的 GC 操作。簡單實現(xiàn)代碼如下:lmc28資訊網(wǎng)——每日最新資訊28at.com

public class Test {    public static void main(String[] args) {         Ticket ticket01 = TicketFactory.getTicket("北京", "杭州");         ticket01.showTicketInfo("上鋪");         Ticket ticket02 = TicketFactory.getTicket("北京", "杭州");         ticket02.showTicketInfo("下鋪");         Ticket ticket03 = TicketFactory.getTicket("北京", "杭州");         ticket03.showTicketInfo("坐票");    }}

運行輸出:lmc28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建對象二=>北京-杭州購買從北京到杭州的上鋪火車票,價格:28使用緩存==>北京-杭州購買從北京到杭州的下鋪火車票,價格:188使用緩存==>北京-杭州購買從北京到杭州的坐票火車票,價格:148

從輸出結(jié)果可以看到,只有第一次查詢車票時創(chuàng)建了一次對象,后續(xù)的查詢都使用的是消息池中的對象。這其實就是相當于一個對象緩存,避免了對象的重復(fù)創(chuàng)建與回收。在這個例子中,內(nèi)部狀態(tài)就是出發(fā)地和目的地,內(nèi)部狀態(tài)不會發(fā)生變化;外部狀態(tài)就是鋪位和價格,價格會隨著鋪位的變化而變化。lmc28資訊網(wǎng)——每日最新資訊28at.com

在 JDK 中 String 也是類似消息池,我們知道在 Java 中 String 是存在于常量池中。也就是說一個 String 被定義之后它就被緩存到了常量池中,當其他地方要使用同樣的字符串時,則直接使用的是緩存,而不會重復(fù)創(chuàng)建。例如下面這段代碼。lmc28資訊網(wǎng)——每日最新資訊28at.com

public class Test {    public static void main(String[] args) {        testString();    }    private static void testString() {        String str1 = new String("abc");        String str2 = "abc";        String str3 = new String("abc");        String str4 = "ab" + "c";        // 使用equals只判定字符值        System.out.println(str1.equals(str2));        System.out.println(str1.equals(str3));        System.out.println(str3.equals(str2));        // 等號判等,判定兩個對象是不是同一個地址        System.out.println(str1 == str2);        System.out.println(str1 == str3);        System.out.println(str3 == str2);        System.out.println(str4 == str2);    }}

輸出:lmc28資訊網(wǎng)——每日最新資訊28at.com

truetruetruefalsefalsefalsetrue


lmc28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-78299-0.html還在重復(fù)創(chuàng)建對象?快試試通過享元模式減少對象創(chuàng)建

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 你不可不知的 15 個 JavaScript 小貼士

下一篇: HTML問題:如何實現(xiàn)分享URL預(yù)覽?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
午夜欧美视频| 麻豆国产精品一区二区三区 | 欧美1区2区| 欧美在线一区二区| 欧美制服第一页| 久久久精品日韩欧美| 亚洲在线免费观看| 一区二区三区成人 | 国产精品免费视频xxxx| 国产乱码精品一区二区三区五月婷| 1000部国产精品成人观看| 亚洲影院一区| 欧美成人小视频| 在线观看视频欧美| 欧美一级久久久久久久大片| 国产精品jizz在线观看美国| 亚洲欧美日韩精品在线| 国产精品专区h在线观看| 亚洲综合色激情五月| 韩日欧美一区| 欧美日韩国产91| 一区二区三区精品| 久久香蕉精品| 一区二区三区视频在线观看| 欧美日韩久久不卡| 国产日韩成人精品| 99精品国产在热久久| 久久成人精品视频| 国产精品久久久久一区二区三区共| 亚洲电影免费观看高清完整版在线| 欧美在线观看日本一区| 欧美三级免费| 9色精品在线| 欧美一站二站| 国产精品vvv| 亚洲一区二区在| 亚洲国产成人av| 亚洲午夜一区二区| 久久婷婷激情| 国产精品久久久久久久久搜平片| 激情一区二区三区| 亚洲欧美成人网| 欧美成人小视频| 国产最新精品精品你懂的| 在线亚洲观看| 欧美a级一区| 国产日韩精品一区二区| 一区二区三区视频观看| 欧美 日韩 国产在线| 国产欧美日韩一区二区三区| 一本色道久久88综合亚洲精品ⅰ| 久久婷婷国产综合国色天香| 国产精品一区毛片| 亚洲天堂男人| 欧美剧在线观看| 亚洲福利视频网| 久久九九精品| 国产欧美亚洲视频| 亚洲一区免费| 欧美日韩国产一中文字不卡| 在线播放亚洲| 久久精品一区二区| 国产欧美日韩一区二区三区在线| 一本色道久久综合亚洲精品高清 | 亚洲激情在线激情| 久久精品99无色码中文字幕| 国产精品久久一卡二卡| 夜夜嗨一区二区三区| 欧美福利精品| 亚洲国产专区校园欧美| 久色成人在线| 尤物网精品视频| 久久久人成影片一区二区三区观看| 国产精品视频不卡| 亚洲永久字幕| 国产精品久久77777| 一区二区三区毛片| 欧美日韩一区二区视频在线| 日韩一级在线观看| 亚洲精选视频免费看| 麻豆精品精品国产自在97香蕉| 国内精品免费在线观看| 久久大逼视频| 国产一区二区无遮挡| 欧美一区二区日韩一区二区| 国产欧美日韩伦理| 欧美专区日韩专区| 国产日韩欧美另类| 久久激情五月激情| 狠狠色综合日日| 久久综合伊人77777麻豆| 狠狠噜噜久久| 老司机成人网| 亚洲欧洲视频在线| 欧美精品高清视频| 一本色道久久99精品综合| 欧美日韩中文字幕| 亚洲免费在线电影| 国产精品视频一二三| 午夜欧美大尺度福利影院在线看| 国产亚洲成年网址在线观看| 欧美在线你懂的| 精品va天堂亚洲国产| 久久久欧美一区二区| 亚洲高清一二三区| 校园春色综合网| 国模一区二区三区| 欧美不卡视频| 一本色道综合亚洲| 欧美精品二区三区四区免费看视频| 亚洲精品中文字幕在线观看| 欧美日韩亚洲一区二区三区在线观看| 一区二区三区视频免费在线观看| 国产精品三上| 久久久99国产精品免费| 亚洲国产日韩欧美在线图片| 欧美色网一区二区| 欧美一区日本一区韩国一区| 在线观看福利一区| 欧美日韩高清不卡| 销魂美女一区二区三区视频在线| 精品动漫3d一区二区三区| 欧美精品18+| 午夜国产不卡在线观看视频| 狠狠做深爱婷婷久久综合一区 | 欧美日韩精品久久久| 午夜久久一区| 亚洲国产老妈| 国产精品久久久久久久久久免费看 | 国产精品久久久久影院色老大 | 欧美在线黄色| 亚洲韩国精品一区| 国产精品毛片一区二区三区| 久久五月天婷婷| 在线视频欧美日韩精品| 国产一区二区三区高清 | 国产精品视频观看| 女人色偷偷aa久久天堂| 亚洲一区黄色| 亚洲国产精品女人久久久| 国产精品久久九九| 欧美aa在线视频| 亚洲欧美日韩国产综合精品二区| 在线成人h网| 国产精品日韩一区二区三区| 欧美jjzz| 欧美在线视屏| 一区二区黄色| 亚洲国产一成人久久精品| 国产精品丝袜91| 欧美精品aa| 欧美在线观看视频在线| 一本色道久久精品| 在线观看一区二区视频| 国产精品影院在线观看| 欧美人牲a欧美精品| 久久都是精品| 亚洲一区二区三区视频| 亚洲人成在线播放| 黄色影院成人| 国产精自产拍久久久久久| 欧美日韩国产高清| 蜜臀av在线播放一区二区三区 | 欧美国产免费| 久久婷婷国产麻豆91天堂| 亚洲一区在线播放| 亚洲美女在线视频| 亚洲国产91色在线| 国产一区清纯| 国产女主播一区二区| 欧美日韩免费精品| 欧美成人免费在线| 久久精品视频网| 午夜精品久久久久久99热软件| 亚洲人成在线观看网站高清| 红桃视频国产精品| 国产欧美一区在线| 国产精品久线观看视频| 欧美人交a欧美精品| 欧美刺激午夜性久久久久久久| 久久蜜桃精品| 午夜综合激情| 亚洲在线第一页| 亚洲视频一区在线| 亚洲最黄网站| 亚洲精品视频在线观看免费| 1000精品久久久久久久久| 国户精品久久久久久久久久久不卡| 国产精品一区视频| 国产精品美女久久福利网站| 欧美日韩综合精品| 欧美日韩国产影片| 欧美久久久久久久| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲男人的天堂在线aⅴ视频| 99国产精品久久久久久久| 亚洲国产日韩综合一区| 在线观看三级视频欧美| 激情视频一区二区| 狠狠色香婷婷久久亚洲精品| 国产一区二区成人| 国产日韩av高清| 国产亚洲一区二区在线观看| 国产欧美一区二区精品性|