小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 Coder編程 2021-03-21

享元模式 Flyweight

Intro

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

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

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

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

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

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

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

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

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

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

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

Reference

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多