最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net創(chuàng)建型設(shè)計(jì)模式之建造者、生成器模式(Builder)

 更新時(shí)間:2022年05月25日 15:06:33   作者:springsnow  
這篇文章介紹了.Net設(shè)計(jì)模式之建造者、生成器模式(Builder),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

在軟件系統(tǒng)中,有時(shí)候面臨著“一個(gè)復(fù)雜對(duì)象”的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對(duì)穩(wěn)定。
如何應(yīng)對(duì)這種變化?如何提供一種“封裝機(jī)制”來隔離出“復(fù)雜對(duì)象的各個(gè)部分”的變化,從而保持系統(tǒng)中的“穩(wěn)定構(gòu)建算法”不隨著需求改變而改變?

二、意圖(Intent)

將一個(gè)復(fù)雜對(duì)象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。——《設(shè)計(jì)模式》GoF

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

協(xié)作(Collaborations)

四、模式的組成

(1)、抽象建造者角色(Builder):為創(chuàng)建一個(gè)Product對(duì)象的各個(gè)部件指定抽象接口,以規(guī)范產(chǎn)品對(duì)象的各個(gè)組成成分的建造。一般而言,此角色規(guī)定要實(shí)現(xiàn)復(fù)雜對(duì)象的哪些部分的創(chuàng)建,并不涉及具體的對(duì)象部件的創(chuàng)建。
(2)、具體建造者(ConcreteBuilder)

     1)實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件。即實(shí)現(xiàn)抽象建造者角色Builder的方法。
     2)定義并明確它所創(chuàng)建的表示,即針對(duì)不同的商業(yè)邏輯,具體化復(fù)雜對(duì)象的各部分的創(chuàng)建
     3) 提供一個(gè)檢索產(chǎn)品的接口
     4) 構(gòu)造一個(gè)使用Builder接口的對(duì)象即在指導(dǎo)者的調(diào)用下創(chuàng)建產(chǎn)品實(shí)例
(3)、指導(dǎo)者(Director):調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對(duì)象的各個(gè)部分。指導(dǎo)者并沒有涉及具體產(chǎn)品類的信息,真正擁有具體產(chǎn)品的信息是具體建造者對(duì)象。它只負(fù)責(zé)保證對(duì)象各部分完整創(chuàng)建或按某種順序創(chuàng)建。
(4)、產(chǎn)品角色(Product):建造中的復(fù)雜對(duì)象。它要包含那些定義組件的類,包括將這些組件裝配成產(chǎn)品的接口。

五、建筑者模式的具體實(shí)現(xiàn)

現(xiàn)在人們的生活水平都提高了,有錢了,我今天就以汽車組裝為例子。每臺(tái)汽車的組裝過程都是一致的,所以我們使用同樣的構(gòu)建過程可以創(chuàng)建不同的表示(即可以組裝成不同型號(hào)的汽車,不能像例子這樣,一會(huì)別克,一會(huì)奧迪的)
組裝汽車、電腦、手機(jī)、電視等等負(fù)責(zé)對(duì)象的這些場景都可以應(yīng)用建造者模式來設(shè)計(jì)。

static void Main(string[] args)
{
    Director director = new Director();
    Builder buickCarBuilder = new BuickBuilder();
    Builder aoDiCarBuilder = new AoDiBuilder();

    director.Construct(buickCarBuilder);
    Car buickCar = buickCarBuilder.GetCar();    //組裝完成,我來駕駛別克了
    buickCar.Show();

    director.Construct(aoDiCarBuilder); // 我老婆就要奧迪了,她比較喜歡大品牌
    Car aoDiCar = aoDiCarBuilder.GetCar();
    aoDiCar.Show();

}

/// <summary>
/// 這個(gè)類型才是組裝的,Construct方法里面的實(shí)現(xiàn)就是創(chuàng)建復(fù)雜對(duì)象固定算法的實(shí)現(xiàn),該算法是固定的,或者說是相對(duì)穩(wěn)定的
/// 這個(gè)人當(dāng)然就是老板了,也就是建造者模式中的指揮者
/// </summary>
public class Director
{
    // 組裝汽車
    public void Construct(Builder builder)
    {
        builder.BuildCarDoor();
        builder.BuildCarWheel();
        builder.BuildCarEngine();
    }
}

/// <summary>
/// 汽車類
/// </summary>
public sealed class Car
{
    // 汽車部件集合
    private IList<string> parts = new List<string>();

    // 把單個(gè)部件添加到汽車部件集合中
    public void Add(string part)
    {
        parts.Add(part);
    }

    public void Show()
    {
        Console.WriteLine("汽車開始在組裝.......");
        foreach (string part in parts)
        {
            Console.WriteLine("組件" + part + "已裝好");
        }

        Console.WriteLine("汽車組裝好了");
    }
}

/// <summary>
/// 抽象建造者,它定義了要?jiǎng)?chuàng)建什么部件和最后創(chuàng)建的結(jié)果,但是不是組裝的的類型,切記
/// </summary>
public abstract class Builder
{
    // 創(chuàng)建車門
    public abstract void BuildCarDoor();
    // 創(chuàng)建車輪
    public abstract void BuildCarWheel();
    //創(chuàng)建車引擎
    public abstract void BuildCarEngine();

    // 獲得組裝好的汽車
    public abstract Car GetCar();
}

/// <summary>
/// 具體創(chuàng)建者,具體的車型的創(chuàng)建者,例如:別克
/// </summary>
public sealed class BuickBuilder : Builder
{
    Car buickCar = new Car();
    public override void BuildCarDoor()
    {
        buickCar.Add("Buick's Door");
    }

    public override void BuildCarWheel()
    {
        buickCar.Add("Buick's Wheel");
    }

    public override void BuildCarEngine()
    {
        buickCar.Add("Buick's Engine");
    }

    public override Car GetCar()
    {
        return buickCar;
    }
}

/// <summary>
/// 具體創(chuàng)建者,具體的車型的創(chuàng)建者,例如:奧迪
/// </summary>
public sealed class AoDiBuilder : Builder
{
    Car aoDiCar = new Car();
    public override void BuildCarDoor()
    {
        aoDiCar.Add("Aodi's Door");
    }

    public override void BuildCarWheel()
    {
        aoDiCar.Add("Aodi's Wheel");
    }

    public override void BuildCarEngine()
    {
        aoDiCar.Add("Aodi's Engine");
    }

    public override Car GetCar()
    {
        return aoDiCar;
    }
}

六、建造者模式的實(shí)現(xiàn)要點(diǎn)

在建造者模式中,指揮者是直接與客戶端打交道的,指揮者將客戶端創(chuàng)建產(chǎn)品的請(qǐng)求劃分為對(duì)各個(gè)部件的建造請(qǐng)求,再將這些請(qǐng)求委派到具體建造者角色,具體建造者角色是完成具體產(chǎn)品的構(gòu)建工作的,卻不為客戶所知道。建造者模式主要用于“分步驟來構(gòu)建一個(gè)復(fù)雜的對(duì)象”,其中“分步驟”是一個(gè)固定的組合過程,而復(fù)雜對(duì)象的各個(gè)部分是經(jīng)常變化的。 產(chǎn)品不需要抽象類,由于建造模式的創(chuàng)建出來的最終產(chǎn)品可能差異很大,所以不大可能提煉出一個(gè)抽象產(chǎn)品類。

在前面文章中介紹的抽象工廠模式解決了“系列產(chǎn)品”的需求變化,而建造者模式解決的是 “產(chǎn)品部分” 的需要變化。

由于建造者隱藏了具體產(chǎn)品的組裝過程,所以要改變一個(gè)產(chǎn)品的內(nèi)部表示,只需要再實(shí)現(xiàn)一個(gè)具體的建造者就可以了,從而能很好地應(yīng)對(duì)產(chǎn)品組成組件的需求變化。

1、建造者模式的優(yōu)點(diǎn):

(1)、使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。
(2)、具體的建造者類之間是相互獨(dú)立的,容易擴(kuò)展。
(3)、由于具體的建造者是獨(dú)立的,因此可以對(duì)建造過程逐步細(xì)化,而不對(duì)其他的模塊產(chǎn)生任何影響。

2、建造者模式的缺點(diǎn):

產(chǎn)生多余的Build對(duì)象以及Dirextor類。

3、創(chuàng)建者模式的使用場景:

(1)、當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。
(2)、相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí)。
(3)、多個(gè)部件或零件,都可以裝配到一個(gè)對(duì)象中,但是產(chǎn)生的運(yùn)行結(jié)果又不相同時(shí)。
(4)、產(chǎn)品類非常復(fù)雜,或者產(chǎn)品類中的調(diào)用順序不同產(chǎn)生了不同的效能。
(5)、創(chuàng)建一些復(fù)雜的對(duì)象時(shí),這些對(duì)象的內(nèi)部組成構(gòu)件間的建造順序是穩(wěn)定的,但是對(duì)象的內(nèi)部組成構(gòu)件面臨著復(fù)雜的變化。

七、.NET框架中的Builder應(yīng)用

在ASP.Net中,我們?cè)趯懸粋€(gè)Page類時(shí),這個(gè)類繼承自System.Web.UI.Page。Page其實(shí)就是一個(gè)Builder,它是一個(gè)容器。它有很多方法,就是所謂的BuilderPart()方法,例如:OnInit()、OnLoad()、OnPreRender()、Render()等,它們都是虛方法,我們都可以去重寫,提供我們自己的實(shí)現(xiàn)。當(dāng)我們編譯到bin文件夾下的dll時(shí),我們就生成了一個(gè)我們自己的ConcreteBuilder實(shí)例。實(shí)際上系統(tǒng)使用的是Page基類。

到此這篇關(guān)于.Net設(shè)計(jì)模式之建造者、生成器模式(Builder)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • WPF框架Prism中模塊Module用法

    WPF框架Prism中模塊Module用法

    這篇文章介紹了WPF框架Prism中模塊Module的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • WPF圖表LiveChart使用詳解

    WPF圖表LiveChart使用詳解

    本文詳細(xì)講解了WPF圖表LiveChart的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.NET中 ObjectDataSource控件的DataObjectTypeName屬性

    ASP.NET中 ObjectDataSource控件的DataObjectTypeName屬性

    本文主要介紹ObjectDataSource控件和DataObjectTypeName屬性的用法,希望能給小伙伴們一些幫助。
    2016-04-04
  • 讀取TXT文件內(nèi)容的方法

    讀取TXT文件內(nèi)容的方法

    讀取TXT文件內(nèi)容的方法...
    2006-10-10
  • AjaxControlToolKit CalendarExtender(日歷擴(kuò)展控件)的使用方法

    AjaxControlToolKit CalendarExtender(日歷擴(kuò)展控件)的使用方法

    使用方法很簡單,就不啰嗦那么多了 翻譯過來就是 日歷擴(kuò)展控件吧 配合TextBox控件使用只要TextBox獲的焦點(diǎn)就會(huì)顯示出來日歷
    2008-10-10
  • WPF框架之Prism介紹

    WPF框架之Prism介紹

    這篇文章介紹了WPF的Prism框架,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • AjaxControlToolKit DropDownExtender(下拉擴(kuò)展控件)使用方法

    AjaxControlToolKit DropDownExtender(下拉擴(kuò)展控件)使用方法

    由于工作的需要,使用了這個(gè)控件 挺簡單,使用這個(gè)擴(kuò)展控件能輕松的吧 Label 控件 TextBox控件擴(kuò)展成類似DropDownList控件的功能。這樣使用既可以使用label控件或者textBox控件的一些屬性又能實(shí)現(xiàn)dropDownList的功能。
    2008-10-10
  • ASP.Net?Core?MVC基礎(chǔ)系列之項(xiàng)目創(chuàng)建

    ASP.Net?Core?MVC基礎(chǔ)系列之項(xiàng)目創(chuàng)建

    這篇文章介紹了創(chuàng)建ASP.Net?Core?MVC項(xiàng)目的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • ASP.NET Core依賴關(guān)系注入

    ASP.NET Core依賴關(guān)系注入

    這篇文章介紹了ASP.NET Core中的依賴關(guān)系注入,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • asp.net Timer的使用方法

    asp.net Timer的使用方法

    使用方法很簡單,對(duì)于需要使用asp.net下timer控件的使用是個(gè)不錯(cuò)的例子
    2008-10-10

最新評(píng)論

长春市| 桐庐县| 招远市| 建阳市| 乌拉特前旗| 康平县| 丹棱县| 祁东县| 沿河| 泰顺县| 合山市| 张掖市| 双江| 如皋市| 汶上县| 阿克苏市| 江口县| 堆龙德庆县| 通山县| 临朐县| 温州市| 来安县| 商水县| 襄城县| 乐至县| 比如县| 宜君县| 德昌县| 百色市| 兴业县| 桃江县| 盱眙县| 土默特左旗| 望江县| 太保市| 梓潼县| 常宁市| 海兴县| 察雅县| 错那县| 南通市|