久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    設計模式之享元模式

     Coder編程 2021-03-21

    享元模式 Flyweight

    Intro

    享元是指一個可復用的對象,通過復用這個享元來減少應用中的內存分配。

    享元模式是為了減少內存占用,盡可能復用已有對象的設計模式,一般來說會把這個可復用的對象放到一個外部的數據結構中,當需要使用到的時候傳給享元。

    享元模式的意圖是復用對象,節省內存,前提是享元對象是不可變對象。

    具體來講,當一個系統中存在大量重復對象的時候,我們就可以利用享元模式,將對象設計成享元,在內存中只保留一份實例,供多處代碼引用,這樣可以減少內存中對象的數量,以起到節省內存的目的。

    實際上,不僅僅相同對象可以設計成享元,對于相似對象,我們也可以將這些對象中相同的部分(字段),提取出來設計成享元,讓這些大量相似對象引用這些享元。

    Sample

    public abstract class Flyweight
    {
        public abstract void Operation(int extrinsicstate);
    }
    
    public class ConcreteFlyweight : Flyweight
    {
        public override void Operation(int extrinsicstate)
        {
            Console.WriteLine("operation in ConcreteFlyweight");
        }
    }
    
    public class UnsharedFlyweight : Flyweight
    {
        public override void Operation(int extrinsicstate)
        {
            Console.WriteLine("operation in UnsharedFlyweight");
        }
    }
    
    public class FlyWeightFactory
    {
        private readonly ConcurrentDictionary<string, Flyweight> _flyweights = new ConcurrentDictionary<string, Flyweight>();
    
        public Flyweight GetFlyweight(string name) => _flyweights.GetOrAdd(name, n => new ConcreteFlyweight());
    }
    
    public class Program
    {
        public static void Main(string[] args)
        {
            var counter = 20;
    
            var factory = new FlyWeightFactory();
            factory.GetFlyweight("X").Operation(counter--);
            factory.GetFlyweight("Y").Operation(counter--);
            factory.GetFlyweight("X").Operation(counter--);
    
            new UnsharedFlyweight().Operation(counter--);
    
            factory.GetFlyweight("X").Operation(counter--);
    
            Console.WriteLine(counter);
            Console.ReadLine();
        }
    }
    

    More

    享元模式的代碼實現非常簡單,主要是通過工廠模式,在工廠類中,通過一個 Dictionary 或數組等 來緩存已經創建好的享元對象,以達到復用的目的,可以參考上面的示例。

    來看一道經典的 C# 面試題目:

    var a = "Hello World";
    var b = "Hello World";
    Console.WriteLine(ReferenceEquals(a, b));
    

    想一下輸出結果是什么,不確定的話可以試一下哈

    CLR 中 string 是一個特殊的類型,string 有一個字符串池(Intern) 的實現就屬于是享元模式的體現,這也是上面的輸出結果的原因,相同的字符串變量值指向了同一塊內存地址

    Reference

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 精品一卡2卡三卡4卡乱码精品视频| 巨爆乳中文字幕爆乳区| 欧美精品亚洲精品日韩专区| 亚洲国产精品成人无码区| 国产AV影片麻豆精品传媒| 影音先锋2020色资源网| 久久综合亚洲色一区二区三区| 亚洲一区二区精品另类| 另类国产精品一区二区| 精品无码一区二区三区AV| 熟女系列丰满熟妇AV| 丝袜美腿一区二区三区| 偷拍精品一区二区三区| 在线中文字幕有码中文| 麻豆精品一区二区综合av| 熟妇人妻不卡中文字幕| 日韩加勒比一本无码精品| 亚洲欧美中文日韩V在线观看 | 亚洲国产精品自产在线播放| 久久亚洲精品无码播放| 女人十八毛片A级十八女人| 亚洲gay片在线gv网站| 亚洲一卡2卡3卡4卡精品| 极品尤物被啪到呻吟喷水| 国产丝袜在线精品丝袜不卡| 99久久精品国产一区二区蜜芽| 又粗又紧又湿又爽的视频| 亚洲av永久无码精品水牛影视 | 午夜不卡欧美AAAAAA在线观看| 免费观看的AV毛片的网站| 亚洲AV福利天堂在线观看| 国产一区二区三区不卡在线看| 国产亚洲综合欧美视频| 国产亚洲精品第一综合另类无码无遮挡又大又爽又黄的视频 | 中文字幕国产精品日韩| 久久人妻无码一区二区| 成人午夜大片免费看爽爽爽 | 欧美人成精品网站播放| 久久综合久久美利坚合众国| 日本一区不卡高清更新二区| 国产初高中生视频在线观看|