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

C# 設計模式系列教程-建造者模式

 更新時間:2016年06月02日 10:00:45   作者:Wang Juqiang  
用戶只需要指定要建造的類型就可以得到它們,而具體的建造過程和細節(jié)不需要知道。

1. 概述

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

2. 建造者模式中的角色

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

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

  3.1 以下是這個實例的類圖,以及對類圖的解讀。

http://img.jbzj.com/file_images/article/201606/201606020956403.png

  3.2 代碼實現(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)建者接口,實現(xiàn)者必須實現(xiàn)該接口中定義的所有抽象方法,防止實現(xiàn)者疏忽而遺漏某個部件的創(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();

    // 返回生成好的對象,這是一個具體方法,每個子類都可以使用它來返回一個已經(jīng)創(chuàng)建成功的對象
    public Person GetPerson()
    {
      return Person;
    }
  }

  // 建造者的具體實現(xiàn),這里是要建造出一個瘦子
  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 = "瘦子的腿";
    }

  }

  // 建造者的具體實現(xiàn),這里是要建造出一個胖子
  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)建一個人的過程,并返回創(chuàng)建成功的產(chǎn)品
    public Person BuildPerson()
    {
      builder.BuildHead();
      builder.BuildBody();
      builder.BuildArm();
      builder.BuildLeg();

      return builder.GetPerson();
    }
  }

4. 模式總結(jié)

  4.1 優(yōu)點

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

  4.2 缺點

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

  4.3 實用范圍
    4.3.1 當創(chuàng)建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。

    4.3.2 當復雜對象的部件相對穩(wěn)定,不會發(fā)生變化時

以上就是本文的全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#項目中跨文件調(diào)用公共類的實例方法

    C#項目中跨文件調(diào)用公共類的實例方法

    在本篇文章里小編給大家整理的是關(guān)于C#項目中如何跨文件調(diào)用公共類的知識點內(nèi)容,需要的朋友們學習下。
    2019-08-08
  • C#中神器類BlockingCollection的實現(xiàn)詳解

    C#中神器類BlockingCollection的實現(xiàn)詳解

    如果你想玩轉(zhuǎn)C#?里面多線程,工廠模式,生產(chǎn)者/消費者,隊列等高級操作,就可以和我一起探索這個強大的線程安全提供阻塞和限制功能的C#神器類BlockingCollection吧
    2023-02-02
  • 在WPF中實現(xiàn)平滑滾動的方法詳解

    在WPF中實現(xiàn)平滑滾動的方法詳解

    這篇文章介紹了WPF實現(xiàn)平滑滾動的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • c# 日歷控件的實現(xiàn)

    c# 日歷控件的實現(xiàn)

    這篇文章主要介紹了c# 實現(xiàn)日歷的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式

    C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式

    這篇文章主要介紹了C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 淺析C# 委托(Delegate)

    淺析C# 委托(Delegate)

    這篇文章主要介紹了C# 委托(Delegate)的相關(guān)資料,文中講解非常詳細,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • 詳解WPF中用戶控件和自定義控件的使用

    詳解WPF中用戶控件和自定義控件的使用

    無論是在WPF中還是WinForm中,都有用戶控件(UserControl)和自定義控件(CustomControl),這兩種控件都是對已有控件的封裝,實現(xiàn)功能重用。但是兩者還是有一些區(qū)別,本文對這兩種控件進行講解
    2023-03-03
  • C#向圖片添加水印的兩種不同場景與解決方法

    C#向圖片添加水印的兩種不同場景與解決方法

    這篇文章給大家介紹了兩種大家可能需要的功能,利用C#實現(xiàn)不同需求的向圖片添加水印的方法,文章通過效果圖和示例代碼介紹的很詳細,有需要的朋友們可以參考借鑒。
    2016-09-09
  • Winform中Treeview實現(xiàn)按需加載的方法

    Winform中Treeview實現(xiàn)按需加載的方法

    這篇文章主要介紹了Winform中Treeview實現(xiàn)按需加載的方法,針對大數(shù)據(jù)量的情況下非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • C#開發(fā)微信門戶及應用(1) 微信接口使用

    C#開發(fā)微信門戶及應用(1) 微信接口使用

    這篇文章主要為大家詳細介紹了C#開發(fā)微信門戶及應用第一篇,微信接口的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論

琼海市| 新平| 南投市| 吉木乃县| 浪卡子县| 常宁市| 苗栗市| 敦化市| 彭阳县| 南平市| 延边| 女性| 林西县| 南陵县| 仙居县| 北安市| 伊通| 灵台县| 建瓯市| 木兰县| 泗洪县| 曲阜市| 理塘县| 夏津县| 梨树县| 两当县| 靖西县| 余江县| 三河市| 白玉县| 龙泉市| 九寨沟县| 阜阳市| 栾城县| 孟村| 西峡县| 丰城市| 台江县| 达拉特旗| 云浮市| 潜江市|