乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      設(shè)計模式之享元模式

       Coder編程 2021-03-21

      享元模式 Flyweight

      Intro

      享元是指一個可復(fù)用的對象,通過復(fù)用這個享元來減少應(yīng)用中的內(nèi)存分配。

      享元模式是為了減少內(nèi)存占用,盡可能復(fù)用已有對象的設(shè)計模式,一般來說會把這個可復(fù)用的對象放到一個外部的數(shù)據(jù)結(jié)構(gòu)中,當(dāng)需要使用到的時候傳給享元。

      享元模式的意圖是復(fù)用對象,節(jié)省內(nèi)存,前提是享元對象是不可變對象。

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

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

      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

      享元模式的代碼實現(xiàn)非常簡單,主要是通過工廠模式,在工廠類中,通過一個 Dictionary 或數(shù)組等 來緩存已經(jīng)創(chuàng)建好的享元對象,以達(dá)到復(fù)用的目的,可以參考上面的示例。

      來看一道經(jīng)典的 C# 面試題目:

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

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

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

      Reference

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多