欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.Net結(jié)構(gòu)型設(shè)計(jì)模式之享元模式(Flyweight)

 更新時(shí)間:2022年05月25日 16:09:05   作者:springsnow  
這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之享元模式(Flyweight),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、動(dòng)機(jī)(Motivate)

在軟件系統(tǒng)中,采用純粹對(duì)象方案的問(wèn)題在于大量細(xì)粒度的對(duì)象會(huì)很快充斥在系統(tǒng)中,從而帶來(lái)很高的運(yùn)行時(shí)代價(jià)——主要指內(nèi)存需求方面的代價(jià)。如何在避免大量細(xì)粒度對(duì)象問(wèn)題的同時(shí),讓外部客戶(hù)程序仍然能夠透明地使用面向?qū)ο蟮姆绞絹?lái)進(jìn)行操作?

二、意圖(Intent)

運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。                                        ——《設(shè)計(jì)模式》GoF

三、結(jié)構(gòu)圖(Structure)

四、模式的組成

(1)、抽象享元角色(Flyweight):此角色是所有的具體享元類(lèi)的基類(lèi),為這些類(lèi)規(guī)定出需要實(shí)現(xiàn)的公共接口。那些需要外部狀態(tài)的操作可以通過(guò)調(diào)用方法以參數(shù)形式傳入。
(2)、具體享元角色(ConcreteFlyweight):實(shí)現(xiàn)抽象享元角色所規(guī)定的接口。如果有內(nèi)部狀態(tài)的話,可以在類(lèi)內(nèi)部定義。
(3)、享元工廠角色(FlyweightFactory):本角色負(fù)責(zé)創(chuàng)建和管理享元角色。本角色必須保證享元對(duì)象可以被系統(tǒng)適當(dāng)?shù)毓蚕?,?dāng)一個(gè)客戶(hù)端對(duì)象調(diào)用一個(gè)享元對(duì)象的時(shí)候,享元工廠角色檢查系統(tǒng)中是否已經(jīng)有一個(gè)符合要求的享元對(duì)象,如果已經(jīng)存在,享元工廠角色就提供已存在的享元對(duì)象,如果系統(tǒng)中沒(méi)有一個(gè)符合的享元對(duì)象的話,享元工廠角色就應(yīng)當(dāng)創(chuàng)建一個(gè)合適的享元對(duì)象。
(4)、客戶(hù)端角色(Client):本角色需要存儲(chǔ)所有享元對(duì)象的外部狀態(tài)。

五、享元模式的具體代碼實(shí)現(xiàn)

/// <summary>
/// 享元的抽象類(lèi)
/// </summary>
public abstract class Flyweight
{
    public abstract void Operation(int extrinsicState);
}
/// <summary>
/// 需要共享的具體類(lèi)
/// </summary>
public class ConceteFlyweight : Flyweight
{
    public override void Operation(int extrinsicState)
    {
        Console.WriteLine("需要共享的具體Flyweight類(lèi):" + extrinsicState);
    }
}
/// <summary>
/// 不需要共享的具體類(lèi)
/// </summary>
public class UnsharedConcreteFlyeight : Flyweight
{
    public override void Operation(int extrinsicState)
    {
        Console.WriteLine("不需要共享的具體Flyweight類(lèi):" + extrinsicState);
    }
}
/// <summary>
/// 一個(gè)工廠類(lèi),用來(lái)合理創(chuàng)建對(duì)象
/// </summary>
public class FlyweightFactory
{
    private Dictionary<string, Flyweight> dic = new Dictionary<string, Flyweight>();
    public Flyweight GetFlyweight(string key, bool type)
    {
        if (!dic.ContainsKey(key))
        {
            Flyweight flyweight = new UnsharedConcreteFlyeight();
            if (type)
                flyweight = new ConceteFlyweight();
            dic.Add(key, flyweight);
        }
        return (Flyweight)dic[key];
    }
}
/// <summary>
/// 客戶(hù)端調(diào)用
/// </summary>
public class App
{
    static void Main()
    {
        int extrinsicState = 26;
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight f1 = factory.GetFlyweight("oec2003", true);
        f1.Operation(++extrinsicState);
        Flyweight f2 = factory.GetFlyweight("oec2003", true);
        f2.Operation(++extrinsicState);
        Flyweight f3 = factory.GetFlyweight("oec2004", false);
        f3.Operation(++extrinsicState);
    }
}

六、享元模式的實(shí)現(xiàn)要點(diǎn):

面向?qū)ο蠛芎玫亟鉀Q了抽象性的問(wèn)題,但是作為一個(gè)運(yùn)行在機(jī)器中的程序?qū)嶓w,我們需要考慮對(duì)象的代價(jià)問(wèn)題。Flyweight設(shè)計(jì)模式主要解決面向?qū)ο蟮拇鷥r(jià)問(wèn)題,一般不觸及面向?qū)ο蟮某橄笮詥?wèn)題。
Flyweight采用對(duì)象共享的做法來(lái)降低系統(tǒng)中對(duì)象的個(gè)數(shù),從而降低細(xì)粒度對(duì)象給系統(tǒng)帶來(lái)的內(nèi)存壓力。在具體實(shí)現(xiàn)方面,要注意對(duì)象狀態(tài)的處理。
對(duì)象的數(shù)量太大從而導(dǎo)致對(duì)象內(nèi)存開(kāi)銷(xiāo)加大——什么樣的數(shù)量才算大?這需要我們仔細(xì)的根據(jù)具體應(yīng)用情況進(jìn)行評(píng)估,而不能憑空臆斷。

1、享元模式的優(yōu)點(diǎn)

(1)、享元模式的優(yōu)點(diǎn)在于它能夠極大的減少系統(tǒng)中對(duì)象的個(gè)數(shù)。
(2)、享元模式由于使用了外部狀態(tài),外部狀態(tài)相對(duì)獨(dú)立,不會(huì)影響到內(nèi)部狀態(tài),所以享元模式使得享元對(duì)象能夠在不同的環(huán)境被共享。

2、享元模式的缺點(diǎn)

(1)、由于享元模式需要區(qū)分外部狀態(tài)和內(nèi)部狀態(tài),使得應(yīng)用程序在某種程度上來(lái)說(shuō)更加復(fù)雜化了。
(2)、為了使對(duì)象可以共享,享元模式需要將享元對(duì)象的狀態(tài)外部化,而讀取外部狀態(tài)使得運(yùn)行時(shí)間變化。

3、在下面所有條件都滿(mǎn)足時(shí),可以考慮使用享元模式:

(1)、一個(gè)系統(tǒng)中有大量的對(duì)象;
(2)、這些對(duì)象耗費(fèi)大量的內(nèi)存;
(3)、這些對(duì)象中的狀態(tài)大部分都可以被外部化;
(4)、這些對(duì)象可以按照內(nèi)部狀態(tài)分成很多的組,當(dāng)把外部對(duì)象從對(duì)象中剔除時(shí),每一個(gè)組都可以?xún)H用一個(gè)對(duì)象代替軟件系統(tǒng)不依賴(lài)這些對(duì)象的身份,滿(mǎn)足上面的條件的系統(tǒng)可以使用享元模式。但是使用享元模式需要額外維護(hù)一個(gè)記錄子系統(tǒng)已有的所有享元的表,而這也需要耗費(fèi)資源,所以,應(yīng)當(dāng)在有足夠多的享元實(shí)例可共享時(shí)才值得使用享元模式。

七、.NET 中享元模式的實(shí)現(xiàn)

.NET在C#中有一個(gè)Code Behind機(jī)制,它表面有一個(gè)aspx文件,背后又有一個(gè)cs文件,它的編譯過(guò)程實(shí)際上會(huì)把a(bǔ)spx文件解析成C#文件,然后編譯成dll,在這個(gè)過(guò)程中,我們?cè)赼spx中寫(xiě)的任何html代碼都會(huì)轉(zhuǎn)化為literal control,literal control是一個(gè)一般的文本控件,它就表示html標(biāo)記。當(dāng)這些標(biāo)記有一樣的時(shí)候,構(gòu)建控件樹(shù)的時(shí)候就會(huì)用到Flyweight模式。
它的應(yīng)用并不是那么平凡,只有在效率空間確實(shí)不高的時(shí)候我們才用它。

到此這篇關(guān)于.Net結(jié)構(gòu)型設(shè)計(jì)模式之享元模式(Flyweight)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • .Net Core使用SignalR實(shí)現(xiàn)斗地主游戲

    .Net Core使用SignalR實(shí)現(xiàn)斗地主游戲

    本文詳細(xì)講解了.Net Core使用SignalR實(shí)現(xiàn)斗地主游戲的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Linux?CentOS下docker部署Asp.Net?Core(.Net6)

    Linux?CentOS下docker部署Asp.Net?Core(.Net6)

    這篇文章介紹了Linux?CentOS下docker部署Asp.Net?Core(.Net6)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Json.Net6.0用法介紹

    Json.Net6.0用法介紹

    這篇文章介紹了Json.Net6.0的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • ASP.NET中Cookie的使用方法

    ASP.NET中Cookie的使用方法

    Cookie是一段文本信息,在客戶(hù)端存儲(chǔ) Cookie 是 ASP.NET 的會(huì)話狀態(tài)將請(qǐng)求與會(huì)話關(guān)聯(lián)的方法之一。瀏覽器對(duì) Cookie 的大小有限制,因此,只有不超過(guò) 4096 字節(jié)才能保證被接受。
    2016-04-04
  • .Net?Core部署Docker容器

    .Net?Core部署Docker容器

    這篇文章介紹了.Net?Core部署Docker容器的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.NET?Core的中間件與管道介紹

    ASP.NET?Core的中間件與管道介紹

    這篇文章介紹了ASP.NET?Core的中間件與管道,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 搭建基礎(chǔ)結(jié)構(gòu)的ABP解決方案介紹

    搭建基礎(chǔ)結(jié)構(gòu)的ABP解決方案介紹

    這篇文章介紹了搭建基礎(chǔ)結(jié)構(gòu)的ABP解決方案的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • .Net中Task Parallel Library的基本用法

    .Net中Task Parallel Library的基本用法

    這篇文章介紹了.Net中Task Parallel Library的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • .Net?6簡(jiǎn)介并和之前版本寫(xiě)法做對(duì)比

    .Net?6簡(jiǎn)介并和之前版本寫(xiě)法做對(duì)比

    這篇文章介紹了.Net?6簡(jiǎn)介并和之前版本寫(xiě)法做對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • ASP.NET?Core中的Razor頁(yè)面介紹

    ASP.NET?Core中的Razor頁(yè)面介紹

    這篇文章介紹了ASP.NET?Core中的Razor頁(yè)面,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02

最新評(píng)論