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

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

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

1. 概述

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

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ò)程,包含定義組成部件的類(lèi),包括將這些部件裝配成最終產(chǎn)品的接口。

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

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

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

  4.2 缺點(diǎn)

    以上例子說(shuō)明,現(xiàn)在我要增加產(chǎn)品的一個(gè)細(xì)節(jié),如把創(chuàng)建腳的過(guò)程也添加進(jìn)來(lái),看我們需要改哪些類(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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C# cmd中修改顯示(顯示進(jìn)度變化效果)的方法

    C# cmd中修改顯示(顯示進(jìn)度變化效果)的方法

    好多人想在運(yùn)行或者調(diào)試含有大量數(shù)據(jù)或者比較慢C#程序的時(shí)候能夠顯示自己的程序完成的程度,這里有一個(gè)方法能發(fā)不斷地修改cmd的同一行,以達(dá)到顯示完成百分比的目的
    2013-04-04
  • C#同步、異步遠(yuǎn)程下載文件實(shí)例

    C#同步、異步遠(yuǎn)程下載文件實(shí)例

    使用C#下載一個(gè)Internet上的文件主要是依靠HttpWebRequest/HttpWebResonse和WebClient。具體處理起來(lái)還有同步和異步兩種方式,所以我們其實(shí)有四種組合
    2014-04-04
  • C#巧用DateTime預(yù)設(shè)可選的日期范圍(如本年度、本季度、本月等)

    C#巧用DateTime預(yù)設(shè)可選的日期范圍(如本年度、本季度、本月等)

    這篇文章主要介紹了C#巧用DateTime預(yù)設(shè)可選的日期范圍,如本年度、本季度、本月等,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 如何實(shí)現(xiàn)定時(shí)推送的具體方案

    如何實(shí)現(xiàn)定時(shí)推送的具體方案

    在工作當(dāng)中遇到了一個(gè)需要定時(shí)向客戶(hù)端推送新聞、文章等內(nèi)容。小項(xiàng)目又用不了大框架,這個(gè)時(shí)候在網(wǎng)上搜了很久沒(méi)有找到合適的解決方案,直到看到了一位大佬寫(xiě)的文章提供了一個(gè)非常不錯(cuò)的思路本篇文章也是受到他的啟發(fā)實(shí)現(xiàn)了之后這里分享給大家
    2021-04-04
  • C#基礎(chǔ)概念二十五問(wèn) 21-25

    C#基礎(chǔ)概念二十五問(wèn) 21-25

    C#基礎(chǔ)概念二十五問(wèn) 21-25...
    2007-04-04
  • C#調(diào)用python腳本的方法詳解

    C#調(diào)用python腳本的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C#調(diào)用python腳本的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),感興趣的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • C#如何優(yōu)雅的結(jié)束線(xiàn)程

    C#如何優(yōu)雅的結(jié)束線(xiàn)程

    這篇文章主要介紹了C#如何優(yōu)雅的結(jié)束一個(gè)線(xiàn)程,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • Unity幸運(yùn)轉(zhuǎn)盤(pán)實(shí)戰(zhàn)項(xiàng)目

    Unity幸運(yùn)轉(zhuǎn)盤(pán)實(shí)戰(zhàn)項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了Unity幸運(yùn)轉(zhuǎn)盤(pán)實(shí)戰(zhàn)項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • HttpHelper類(lèi)的調(diào)用方法詳解

    HttpHelper類(lèi)的調(diào)用方法詳解

    這篇文章主要為大家詳細(xì)介紹了HttpHelper類(lèi)的使用方法,HttpHelper類(lèi)及調(diào)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#使用NPOI導(dǎo)入Excel的方法詳解

    C#使用NPOI導(dǎo)入Excel的方法詳解

    這篇文章主要介紹了C#使用NPOI導(dǎo)入Excel的方法,簡(jiǎn)單介紹了NPOI的功能及操作Excel的導(dǎo)入、讀取等相關(guān)技巧,需要的朋友可以參考下
    2017-04-04

最新評(píng)論