国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

C# 設(shè)計(jì)模式系列教程-建造者模式

2020-01-24 01:08:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1. 概述

  將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示,這樣的設(shè)計(jì)模式被稱為建造者模式。

2. 建造者模式中的角色

  2.1 建造者(Builder):為創(chuàng)建一個(gè)產(chǎn)品對(duì)象的各個(gè)部件指定抽象接口。
  2.2 具體建造者(ConcreteBuilder):實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件,定義并明確它所創(chuàng)建的表示,并 提供一個(gè)檢索產(chǎn)品的接口。
  2.3 指揮者(Director):指揮并構(gòu)造一個(gè)使用Builder接口的對(duì)象。
  2.4 產(chǎn)品(Product):表示被構(gòu)造的復(fù)雜對(duì)象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過(guò)程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。

3. 實(shí)例:創(chuàng)建一個(gè)人,這個(gè)人可以有不同的特點(diǎn),可以是胖子,可以是瘦子,可以是高個(gè)子,也可以是矮個(gè)子。

  3.1 以下是這個(gè)實(shí)例的類圖,以及對(duì)類圖的解讀。

http://files.VeVB.COm/file_images/article/201606/201606020956403.png

  3.2 代碼實(shí)現(xiàn)及解讀:

  // 要建造的產(chǎn)品  public class Person  {    public string Head { get; set; }    public string Body { get; set; }    public string Arm { get; set; }    public string Leg { get; set; }  }  // 定義創(chuàng)建者接口,實(shí)現(xiàn)者必須實(shí)現(xiàn)該接口中定義的所有抽象方法,防止實(shí)現(xiàn)者疏忽而遺漏某個(gè)部件的創(chuàng)建  public abstract class Builder  {    protected Person Person { get; set; }    public Builder()    {      Person = new Person();    }    // 建造頭    public abstract void BuildHead();    // 建造身體    public abstract void BuildBody();    // 建造胳膊    public abstract void BuildArm();    // 建造腿    public abstract void BuildLeg();    // 返回生成好的對(duì)象,這是一個(gè)具體方法,每個(gè)子類都可以使用它來(lái)返回一個(gè)已經(jīng)創(chuàng)建成功的對(duì)象    public Person GetPerson()    {      return Person;    }  }  // 建造者的具體實(shí)現(xiàn),這里是要建造出一個(gè)瘦子  public class ThinPersonBuilder : Builder  {    public ThinPersonBuilder()    {      Person = new Person();    }    public override void BuildHead()    {      Person.Head = "瘦子的腦袋";    }    public override void BuildBody()    {      Person.Body = "瘦子的身體";    }    public override void BuildArm()    {      Person.Arm = "瘦子的胳膊";    }    public override void BuildLeg()    {      Person.Leg = "瘦子的腿";    }  }  // 建造者的具體實(shí)現(xiàn),這里是要建造出一個(gè)胖子  public class FatPersonBuilder : Builder  {    public override void BuildHead()    {      Person.Head = "胖子的腦袋";    }    public override void BuildBody()    {      Person.Body = "胖子的身體";    }    public override void BuildArm()    {      Person.Head = "胖子的胳膊";    }    public override void BuildLeg()    {      Person.Head = "胖子的腿";    }  }  // 建造者模式中的指揮者  public class PersonDirector  {    Builder builder;    public PersonDirictor(Builder personBuilder)    {      builder = personBuilder;    }    // 指揮創(chuàng)建一個(gè)人的過(guò)程,并返回創(chuàng)建成功的產(chǎn)品    public Person BuildPerson()    {      builder.BuildHead();      builder.BuildBody();      builder.BuildArm();      builder.BuildLeg();      return builder.GetPerson();    }  }

4. 模式總結(jié)

  4.1 優(yōu)點(diǎn)

    4.1.1 用戶只需要指定要建造的類型就可以得到它們,而具體的建造過(guò)程和細(xì)節(jié)不需要知道。
    4.1.2 建造代碼與表示相分離,如果要改變一個(gè)產(chǎn)品的內(nèi)部表示,只要再定義一個(gè)新的具體的建造者就可以了。
    4.1.3 建造過(guò)程由指揮者來(lái)控制,建造細(xì)節(jié)由一個(gè)抽象類來(lái)控制,對(duì)于實(shí)現(xiàn)建造細(xì)節(jié)的具體類來(lái)說(shuō),不會(huì)遺漏某一個(gè)步驟。

  4.2 缺點(diǎn)

    以上例子說(shuō)明,現(xiàn)在我要增加產(chǎn)品的一個(gè)細(xì)節(jié),如把創(chuàng)建腳的過(guò)程也添加進(jìn)來(lái),看我們需要改哪些類。Buider,FatPersonBuilder,ThinPersonBuilder(甚至更多,如果你實(shí)現(xiàn)了TallPersonBuilder,ShortPersonBuilder等),PersonDirector,我們對(duì)修改也就開(kāi)放了。

  4.3 實(shí)用范圍
    4.3.1 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。

    4.3.2 當(dāng)復(fù)雜對(duì)象的部件相對(duì)穩(wěn)定,不會(huì)發(fā)生變化時(shí)

以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 天峨县| 肥西县| 青龙| 南靖县| 滦南县| 沧州市| 略阳县| 承德县| 武冈市| 汝阳县| 上饶县| 浑源县| 磐安县| 黄浦区| 宽甸| 乾安县| 稻城县| 天镇县| 峨眉山市| 阿鲁科尔沁旗| 白河县| 壶关县| 康乐县| 贵港市| 卓尼县| 罗江县| 永善县| 陆河县| 高密市| 清水河县| 卢氏县| 承德市| 沙坪坝区| 利辛县| 耒阳市| 张家港市| 易门县| 文化| 白山市| 许昌县| 焦作市|