国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

還在重復創建對象?快試試通過享元模式減少對象創建

開發 前端
在實現享元模式時,通常會創建一個工廠類來管理共享的對象實例,并在需要時返回已存在的實例,而不是創建新的實例。這樣可以減少內存占用,并且可以提高系統的性能。

享元模式

享元模式是一種結構型設計模式,旨在通過共享盡可能多的數據來最小化內存使用和提高性能。在享元模式中,對象被分為內部狀態和外部狀態。內部狀態是可以共享的,而外部狀態是根據對象的上下文而變化的。

在實現享元模式時,通常會創建一個工廠類來管理共享的對象實例,并在需要時返回已存在的實例,而不是創建新的實例。這樣可以減少內存占用,并且可以提高系統的性能。

應用場景

享元模式適用于需要共享大量對象、減少內存占用、優化性能的場景。

  1. 對象的數量非常大,且占用大量內存。通過享元模式可以共享對象,減少內存占用。
  2. 對象的大部分狀態可以外部狀態,而少部分狀態可以內部狀態。通過享元模式可以將內部狀態和外部狀態分離,減少對象數量。
  3. 對象的狀態可以被多個對象共享。通過享元模式可以將狀態共享,減少重復創建對象。
  4. 對象的創建和銷毀頻繁,需要優化性能。通過享元模式可以減少對象的創建和銷毀,提高性能。

場景示例

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

首先我們創建一個 Ticket 接口,該接口定義展示車票信息的函數:

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

它的一個具體的實現類是 TrainTicket 類:

class TrainTicket implements Ticket {
    public String from; // 始發地
    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);
    }
}

數據庫中表示火車票的信息有出發地、目的地、鋪位、價格等字段,在購票用戶每次查詢時如果沒有用某種緩存模式,那么返回車票數據的接口實現如下:

public class TicketFactory {

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

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

使用享元模式很簡單,只需要簡單地改造一下 TicketFactory,具體代碼如下:

/**
 * 車票工廠,以出發地和目的地為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("創建對象 ==> " + key);
            Ticket ticket = new TrainTicket(from, to);
            sTicketMap.put(key, ticket);
            return ticket;
        }
    }
}

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

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("坐票");
    }
}

運行輸出:

創建對象二=>北京-杭州
購買從北京到杭州的上鋪火車票,價格:28

使用緩存==>北京-杭州
購買從北京到杭州的下鋪火車票,價格:188

使用緩存==>北京-杭州
購買從北京到杭州的坐票火車票,價格:148

從輸出結果可以看到,只有第一次查詢車票時創建了一次對象,后續的查詢都使用的是消息池中的對象。這其實就是相當于一個對象緩存,避免了對象的重復創建與回收。在這個例子中,內部狀態就是出發地和目的地,內部狀態不會發生變化;外部狀態就是鋪位和價格,價格會隨著鋪位的變化而變化。

在 JDK 中 String 也是類似消息池,我們知道在 Java 中 String 是存在于常量池中。也就是說一個 String 被定義之后它就被緩存到了常量池中,當其他地方要使用同樣的字符串時,則直接使用的是緩存,而不會重復創建。例如下面這段代碼。

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);
    }
}

輸出:

true
true
true
false
false
false
true


責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2017-02-06 09:20:23

JavaScript實踐

2016-06-20 11:32:27

JS原型class

2011-04-15 17:07:13

Java

2024-12-27 15:10:16

設計模式原型模式場景

2010-06-24 09:38:42

Windows備份云平臺

2020-05-25 10:20:19

享元模式場景

2012-01-13 12:57:48

Java

2021-03-08 08:40:25

Spring Bean 創建單例對象

2023-02-27 08:09:42

SpringAOP代理

2009-08-10 13:40:46

創建C# COM對象

2024-02-27 11:59:12

享元模式對象

2024-03-26 10:30:37

Mybatis擴展庫API

2009-05-19 14:13:46

.NET反射Assembly

2010-10-08 11:29:24

JavaScript對象

2013-05-27 15:38:37

Java對象C++

2010-10-08 10:52:36

JavaScript對

2021-03-17 07:49:21

Java對象內存

2009-08-25 17:28:23

C#創建DataSet

2009-12-21 17:35:24

ADO.NET對象

2009-08-10 13:34:11

創建C# COM對象
點贊
收藏

51CTO技術棧公眾號

国产精品12| 日日骚一区二区网站| 蜜臀av在线| 亚洲成人动漫精品| 黄色影院一级片| 国产一区二区三区不卡在线观看 | 中国一级特黄毛片大片| 麻豆精品视频在线观看| 欧美激情专区| 美女久久一区| 成人久久一区二区| 亚洲第一会所001| 我不卡神马影院| 国模一区二区三区白浆| 污片在线观看一区二区| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 久久亚洲精华国产精华液| 国产欧美日韩伦理| 欧美日韩国产探花| 成人av免费在线看| 午夜精品剧场| 国产一区免费在线| 免费看的黄色欧美网站| 欧美日韩在线观看一区二区三区| 久久精品免费| av动漫在线免费观看| av影院午夜一区| 簧片在线免费看| 亚洲精品成人少妇| 中文字幕在线视频不卡| 日韩欧美在线视频观看| 亚洲s色大片| 精品国产网站在线观看| 亚洲精品永久免费视频| 中文字幕一区日韩电影| 久久久精品区| 国产精品国产福利国产秒拍| 日韩欧美视频| 奇米精品在线| 国产成人免费xxxxxxxx| 91在线视频观看免费| 亚洲人成网站在线| 国产福利电影在线| 日韩精品中文字幕久久臀| 国产福利91精品一区二区| 欧美国产日韩精品| 色综合久久网| 亚洲国产婷婷香蕉久久久久久99| 成人国产精品免费观看| 一级在线免费视频| 色综合久久久久久久久| 7777kkk亚洲综合欧美网站| 欧美精品一二区| 亚洲精品在线观看91| 日本在线播放一区| 中文文精品字幕一区二区| 四虎国产精品永远| 亚洲视频日韩精品| 四虎成人av| 爱爱爱视频网站| 亚洲视频1区2区| 免费在线国产视频| 2019最新中文字幕| 亚洲久久视频| 欧美日韩一区二区在线免费观看| 精品久久久久久久久久国产 | 欧美亚洲另类在线一区二区三区 | 欧美大香线蕉线伊人久久国产精品| 国产乱妇无码大片在线观看| 在线视频xx| 日韩欧美中文一区二区| 日韩精品免费视频一区二区三区| 92看片淫黄大片看国产片| 国产精品一区在线| 四虎影视2018在线播放alocalhost| 日韩精品在线免费观看| 欧美日韩水蜜桃| www.99riav| 日本韩国一区二区三区视频| 国产成人免费精品| 国产高清在线精品一区二区三区| 91麻豆精品视频| 欧美videos另类精品| 国产成人aa精品一区在线播放| 免费在线观看不卡| 欧美色视频免费| 韩国美女主播一区| 国产一区二区在线观看免费| 色视频在线看| 性色av一区二区咪爱| 国内精品免费**视频| 成人欧美亚洲| 5252色成人免费视频| 成人午夜伦理影院| 怡红院红怡院欧美aⅴ怡春院| 国产精品av电影| 国产日韩欧美制服另类| 成人动漫一区| 五月天国产一区| 欧美视频一区二区三区四区| 九色丨蝌蚪丨成人| 成人av一级片| 亚洲欧洲视频在线| 日韩av一区二区三区| 国产一区二区三区福利| 国产精品老女人精品视频| 久久精品男人的天堂| 欧美大片免费| 亚洲一区二区三区欧美| 欧美又粗又大又爽| 亚洲第一偷拍| 在线看国产视频| 国产精品久久久久久久久影视| 高清不卡在线观看| 中文字幕 在线观看| 五月天亚洲综合小说网| 欧美男生操女生| 亚洲福利一区| 欧美18hd| 国产一区二区三区黄| 欧美日韩国产麻豆| 欧美黄色大片在线观看| 香港日本韩国三级| 国产精品白嫩初高中害羞小美女| 日本一二三不卡| 精品深夜福利视频| 午夜伦伦电影理论片费看| 久久伊人91精品综合网站| 午夜精品一区二区在线观看的| 91网站在线播放| 性欧美高清come| 国产精品电影网站| 大桥未久av一区二区三区中文| 青青免费在线视频| 97在线观看免费高清| 国产精品久久夜| 66精品视频在线观看| 国产91色在线|亚洲| 不卡一区在线观看| 91香蕉在线观看| 久久久久久久久网站| 成人激情校园春色| 国产精品22p| 日韩成人在线一区| 日韩三级一区| 亚洲**毛片| 91麻豆精品国产综合久久久| 香港日本韩国三级| 草草草视频在线观看| 久久视频在线免费观看| 亚洲人成网站色ww在线| 中文字幕在线日韩| 日韩中文字幕在线精品| 精品久久一区二区三区| 国产丝袜精品第一页| 精品久久久久久最新网址| 中文字幕一区二| 在线观看欧美| 国产在线你懂得| 亚洲国产精品一区在线观看不卡| 日韩一级高清毛片| 99精品偷自拍| 日韩av电影天堂| se01亚洲视频| 91天堂在线| 欧美少妇一级片| 中文字幕日本不卡| 欧美久久久久久蜜桃| 亚洲精品一区中文字幕乱码| 欧美一区二区大片| 色综合天天综合狠狠| 成人黄色a**站在线观看| 日本视频在线一区| 自拍视频亚洲| 天堂一区二区三区四区| 午夜电影亚洲| 91在线观看地址| 精品资源在线| 在线视频91p| www插插插无码视频网站| 欧美做受高潮1| 欧美一区二区视频观看视频 | 亚洲影视在线| 高清一区二区| 你懂的免费在线观看| 中文字幕日韩一区二区三区不卡 | 久久久久综合一区二区三区| 日韩中文av在线| 黄色精品一区二区| 精品亚洲porn| 欧美www视频在线观看| 三级成人黄色影院| 中文官网资源新版中文第二页在线观看| 日韩精品最新在线观看| 91爱视频在线| 亚洲午夜激情免费视频| 日本精品一级二级| 日韩美女视频一区| 国产91丝袜在线播放九色| 午夜欧美精品|