亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

深入解析C#設計模式編程中對建造者模式的運用

2020-01-24 01:16:22
字體:
來源:轉載
供稿:網友

示例

我們先來以這樣一個場景引入: 
在電腦城裝機總有這樣的經歷。我們到了店里,先會有一個銷售人員來詢問你希望裝的機器是怎么樣的配置,他會給你一些建議,最終會形成一張裝機單。和客戶確定了裝機配置以后,他會把這張單字交給提貨的人,由他來準備這些配件,準備完成后交給裝機技術人員。技術人員會把這些配件裝成一個整機交給客戶。

不管是什么電腦,它總是由CPU、內存、主板、硬盤以及顯卡等部件構成的,并且裝機的過程總是固定的:

  • 把主板固定在機箱中
  • 把CPU安裝到主板上
  • 把內存安裝到主板上
  • 把硬盤連接到主板上
  • 把顯卡安裝到主板上

但是,每臺兼容機的部件都各不相同的,有些配置高一點,有些配置低一點,這是變化點。對于裝機技術人員來說,他不需要考慮這些配件從哪里來的,他只需要把他們組裝在一起了,這是穩定的裝機流程。要把這種變化的配件和穩定的流程進行分離就需要引入Builder模式。
示例代碼

using System;using System.Collections.Generic;using System.Text;using System.Reflection; namespace BuilderExemple{  classProgram  {    staticvoid Main(string[] args)    {      ComputerFactory factory = newComputerFactory();      ComputerBuilder office = newOfficeComputerBuilder();      factory.BuildComputer(office);      office.Computer.ShowSystemInfo();      ComputerBuilder game = newGameComputerBuilder();      factory.BuildComputer(game);      game.Computer.ShowSystemInfo();    }  }   classComputerFactory  {    publicvoid BuildComputer(ComputerBuilder cb)    {      Console.WriteLine();      Console.WriteLine(">>>>>>>>>>>>>>>>>>Start Building " + cb.Name);      cb.SetupMainboard();      cb.SetupCpu();      cb.SetupMemory();      cb.SetupHarddisk();      cb.SetupVideocard();      Console.WriteLine(">>>>>>>>>>>>>>>>>>Build " + cb.Name + " Completed");      Console.WriteLine();    }  }   abstractclassComputerBuilder  {    protectedstring name;     publicstring Name    {      get { return name; }      set { name = value; }    }     protectedComputer computer;     publicComputer Computer    {      get { return computer; }      set { computer = value; }    }     public ComputerBuilder()    {      computer = newComputer();    }     publicabstractvoid SetupMainboard();    publicabstractvoid SetupCpu();    publicabstractvoid SetupMemory();    publicabstractvoid SetupHarddisk();    publicabstractvoid SetupVideocard();  }   classOfficeComputerBuilder : ComputerBuilder  {    public OfficeComputerBuilder()    {      name = "OfficeComputer";    }     publicoverridevoid SetupMainboard()    {      computer.Mainboard = "Abit升技LG-95C 主板(Intel 945GC芯片組/LGA 775/1066MHz) ";    }     publicoverridevoid SetupCpu()    {      computer.Cpu = "Intel 英特爾賽揚D 336 (2.8GHz/LGA 775/256K/533MHz) ";    }     publicoverridevoid SetupMemory()    {      computer.Memory = "Patriot博帝DDR2 667 512MB 臺式機內存";    }     publicoverridevoid SetupHarddisk()    {      computer.Harddisk = "Hitachi日立SATAII接口臺式機硬盤(80G/7200轉/8M)盒裝";    }     publicoverridevoid SetupVideocard()    {      computer.Videocard = "主板集成";    }  }   classGameComputerBuilder : ComputerBuilder  {    public GameComputerBuilder()    {      name = "GameComputer";    }     publicoverridevoid SetupMainboard()    {      computer.Mainboard = "GIGABYTE技嘉GA-965P-DS3 3.3 主板(INTEL P965 東莞產)" ;    }     publicoverridevoid SetupCpu()    {      computer.Cpu = "Intel 英特爾酷睿E4400 (2.0GHz/LGA 775/2M/800MHz)盒裝";    }     publicoverridevoid SetupMemory()    {      computer.Memory = "G.SKILL 芝奇F2-6400CL5D-2GBNQ DDR2 800 1G*2臺式機內存";    }     publicoverridevoid SetupHarddisk()    {      computer.Harddisk = "Hitachi日立SATAII接口臺式機硬盤(250G/7200轉/8M)盒裝";    }     publicoverridevoid SetupVideocard()    {      computer.Videocard = "七彩虹逸彩GT-GD3 UP烈焰戰神H10 顯卡(GeForce 8600GT/256M/DDR3)支持HDMI!";    }  }   classComputer  {    privatestring videocard;     publicstring Videocard    {      get { return videocard; }      set { videocard = value; }    }     privatestring cpu;     publicstring Cpu    {      get { return cpu; }      set { cpu = value; }    }     privatestring mainboard;     publicstring Mainboard    {      get { return mainboard; }      set { mainboard = value; }    }     privatestring memory;     publicstring Memory    {      get { return memory; }      set { memory = value; }    }     privatestring harddisk;     publicstring Harddisk    {      get { return harddisk; }      set { harddisk = value; }    }     publicvoid ShowSystemInfo()    {      Console.WriteLine("==================SystemInfo==================");      Console.WriteLine("CPU:" + cpu);      Console.WriteLine("MainBoard:" + mainboard);      Console.WriteLine("Memory:" + memory);      Console.WriteLine("VideoCard:" + videocard);      Console.WriteLine("HardDisk:" + harddisk);    }  }}

代碼說明: 

ComputerFactory是建造者模式的指導者。指導者做的是穩定的建造工作,假設它就是一個技術人員,他只是在做按照固定的流程,把配件組裝成計算機的重復勞動工作。他不知道他現在組裝的是一臺游戲電腦還是一臺辦公用電腦,他也不知道他往主板上安裝的內存是1G還是2G的。呵呵,看來是不稱職的技術人員。

ComputerBuilder是抽象建造者角色。它主要是用來定義兩種接口,一種接口用于規范產品的各個部分的組成。比如,這里就規定了組裝一臺電腦所需要的5個工序。第二種接口用于返回建造后的產品,在這里我們沒有定義抽象方法,反正建造出來的總是電腦。

OfficeComputerBuilder和GameComputerBuilder是具體的建造者。他的工作就是實現各建造步驟的接口,以及實現返回產品的接口,在這里后者省略了。

Computer就是建造出來的復雜產品。在代碼中,我們的各種建造步驟都是為創建產品中的各種配件服務的,Computer定義了一個相對具體的產品,在應用中可以把這個產品進行比較高度的抽象,使得不同的具體建造者甚至可以建造出完全不同的產品。

看看客戶端的代碼,用戶先是選擇了一個具體的Builder,用戶應該很明確它需要游戲電腦還是辦公電腦,但是它可以對電腦一無所知,由銷售人員給出一個合理的配置單。然后用戶讓ComputerFactory去為它組裝這個電腦。組裝完成后ComputerFactory開機,給用戶驗收電腦的配置是否正確。

你或許覺得ComputerBuilder和是抽象工廠模式中的抽象工廠角色差不多,GameComputerBuilder又像是具體工廠。其實,建造者模式和抽象工廠模式的側重點不同,前者強調一個組裝的概念,一個復雜對象由多個零件組裝而成并且組裝是按照一定的標準射順序進行的,而后者強調的是創建一系列產品。建造者模式適用于組裝一臺電腦,而抽象工廠模式適用于提供用戶筆記本電腦、臺式電腦和掌上電腦的產品系列。


建造者模式的定義和類圖
  介紹完了建造者模式的具體實現之后嗎,下面具體看下建造者模式的具體定義是怎樣的。

建造者模式(Builder Pattern):將一個復雜對象的構建于它的表示分離,使得同樣的構建過程可以創建不同的表示。

建造者模式使得建造代碼與表示代碼的分離,可以使客戶端不必知道產品內部組成的細節,從而降低了客戶端與具體產品之間的耦合度,下面通過類圖來幫助大家更好地理清建造者模式中類之間的關系。

2016217151228462.png (761×411)

建造者模式的分析
介紹完了建造者模式的具體實現之后,讓我們總結下建造模式的實現要點:

在建造者模式中,指揮者是直接與客戶端打交道的,指揮者將客戶端創建產品的請求劃分為對各個部件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工作的,卻不為客戶所知道。
建造者模式主要用于“分步驟來構建一個復雜的對象”,其中“分步驟”是一個固定的組合過程,而復雜對象的各個部分是經常變化的(也就是說電腦的內部組件是經常變化的,這里指的的變化如硬盤的大小變了,CPU由單核變雙核等)。
產品不需要抽象類,由于建造模式的創建出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類。
在前面文章中介紹的抽象工廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。
由于建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成組件的需求變化。

.NET 中建造者模式的實現
  前面的設計模式在.NET類庫中都有相應的實現,那在.NET 類庫中,是否也存在建造者模式的實現呢? 然而對于疑問的答案是肯定的,在.NET 類庫中,System.Text.StringBuilder(存在mscorlib.dll程序集中)就是一個建造者模式的實現。不過它的實現屬于建造者模式的演化,此時的建造者模式沒有指揮者角色和抽象建造者角色,StringBuilder類即扮演著具體建造者的角色,也同時扮演了指揮者和抽象建造者的角色,此時建造模式的實現如下:

/// <summary>  /// 建造者模式的演變  /// 省略了指揮者角色和抽象建造者角色  /// 此時具體建造者角色扮演了指揮者和建造者兩個角色  /// </summary>  public class Builder  {    // 具體建造者角色的代碼    private Product product = new Product();    public void BuildPartA()    {      product.Add("PartA");    }    public void BuildPartB()    {      product.Add("PartB");    }    public Product GetProduct()    {      return product;    }    // 指揮者角色的代碼    public void Construct()    {      BuildPartA();      BuildPartB();    }  }  /// <summary>  /// 產品類  /// </summary>  public class Product  {    // 產品組件集合    private IList<string> parts = new List<string>();    // 把單個組件添加到產品組件集合中    public void Add(string part)    {      parts.Add(part);    }    public void Show()    {      Console.WriteLine("產品開始在組裝.......");      foreach (string part in parts)      {        Console.WriteLine("組件" + part + "已裝好");      }      Console.WriteLine("產品組裝完成");    }  }  // 此時客戶端也要做相應調整  class Client  {    private static Builder builder;    static void Main(string[] args)    {      builder = new Builder();      builder.Construct();      Product product = builder.GetProduct();      product.Show();      Console.Read();    }  }

StringBuilder類扮演著建造string對象的具體建造者角色,其中的ToString()方法用來返回具體產品給客戶端(相當于上面代碼中GetProduct方法)。其中Append方法用來創建產品的組件(相當于上面代碼中BuildPartA和BuildPartB方法),因為string對象中每個組件都是字符,所以也就不需要指揮者的角色的代碼(指的是Construct方法,用來調用創建每個組件的方法來完成整個產品的組裝),因為string字符串對象中每個組件都是一樣的,都是字符,所以Append方法也充當了指揮者Construct方法的作用。


總結
到這里,建造者模式的介紹就結束了,建造者模式(Builder Pattern),將一個復雜對象的構建與它的表示分離,使的同樣的構建過程可以創建不同的表示。建造者模式的本質是使組裝過程(用指揮者類進行封裝,從而達到解耦的目的)和創建具體產品解耦,使我們不用去關心每個組件是如何組裝的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频公开费视频| 国产综合香蕉五月婷在线| 久久成年人视频| 欧美日韩在线一区| 国产精品久久久av久久久| 日本一区二区在线免费播放| 成人免费视频在线观看超级碰| 亚洲亚裔videos黑人hd| 日韩少妇与小伙激情| 欧美性感美女h网站在线观看免费| 国产欧美一区二区白浆黑人| 久久69精品久久久久久国产越南| 欧美激情一级二级| 欧美一级片在线播放| 日韩美女在线观看| 91黑丝在线观看| 欧美日韩中文字幕| 91九色国产视频| 97在线视频免费播放| 国产精品三级美女白浆呻吟| 亚洲aaa激情| 日本一区二区在线免费播放| 亚洲欧美国产另类| 日韩av在线免费看| 久久久精品美女| 秋霞av国产精品一区| 中文字幕精品久久久久| www.美女亚洲精品| 欧美xxxx做受欧美| 国产成人精品在线| 久久久久国产精品一区| 亚洲天堂开心观看| 国产在线98福利播放视频| 九九视频直播综合网| 国产97在线观看| 亚洲情综合五月天| 亚洲久久久久久久久久| 日韩视频免费在线| 精品亚洲夜色av98在线观看| 亚洲男人的天堂在线| 精品久久久久久中文字幕一区奶水| 91在线观看免费高清| 98精品在线视频| 亚州欧美日韩中文视频| 久久精品国产91精品亚洲| 欧美国产欧美亚洲国产日韩mv天天看完整| 91tv亚洲精品香蕉国产一区7ujn| 亚洲激情视频在线观看| 狠狠干狠狠久久| 日韩av电影中文字幕| 亚洲尤物视频网| 欧美精品第一页在线播放| 亚洲精品一区中文字幕乱码| 日韩激情av在线播放| 日韩中文字幕免费视频| 亚洲欧美国产日韩天堂区| 国产视频精品一区二区三区| 国产精品久久久久久久一区探花| 亚洲精品日韩欧美| 国产精品免费电影| 亚洲精品色婷婷福利天堂| 国产精品日韩欧美大师| xxx成人少妇69| 亚洲免费成人av电影| 国产最新精品视频| 欧美大成色www永久网站婷| 国产美女久久精品香蕉69| 国产午夜精品全部视频在线播放| 欧美日韩亚洲精品一区二区三区| 国产精品久久一| 韩日精品中文字幕| 亚洲最新中文字幕| 国产精品第100页| 日韩精品在线观看网站| 亚洲欧美在线播放| 91在线播放国产| 欧美在线免费观看| 亚洲精品免费一区二区三区| 久久久亚洲福利精品午夜| 日韩在线视频免费观看| 国产视频久久久久| 日韩网站免费观看高清| 国产精品视频男人的天堂| 欧洲一区二区视频| 77777少妇光屁股久久一区| 亚洲香蕉成人av网站在线观看| 九九热精品视频| 国产精品久久不能| 日韩少妇与小伙激情| 国产精品美女午夜av| 国产精品久久久久久久久久新婚| 成人黄色短视频在线观看| 国产一区二区三区直播精品电影| 一区二区亚洲欧洲国产日韩| 黑人巨大精品欧美一区二区三区| 91久久精品国产91久久| 欧美日韩一区二区在线| 中文字幕免费精品一区高清| 日韩精品在线免费播放| 亚洲国产免费av| 日本精品久久中文字幕佐佐木| 国产成人精品av| 国产精品久在线观看| 欧美日韩国产第一页| 欧洲日韩成人av| 国产精品久久久久不卡| 国产精品视频1区| 亚洲精品自拍偷拍| 国产精品久久久久久av下载红粉| 亚洲国产欧美一区| 亚洲国产精品成人一区二区| 欧美激情xxxx性bbbb| 欧美有码在线视频| 中文字幕国产亚洲2019| 曰本色欧美视频在线| 国产成人一区二| 欧美一区在线直播| 亚洲精品一区二区网址| 午夜精品久久久久久99热| 亚洲视频自拍偷拍| 国产精品亚洲激情| 精品国产91久久久久久| 日韩一区二区三区xxxx| 久久99精品视频一区97| 国产精品美女视频网站| 欧美插天视频在线播放| 国内精品久久久久影院优| 日本乱人伦a精品| 亚洲精品大尺度| 国产精品视频永久免费播放| 国产伦精品一区二区三区精品视频| 日韩网站免费观看高清| 亚洲成人999| 91精品一区二区| 激情懂色av一区av二区av| 精品久久香蕉国产线看观看gif| 国产91精品最新在线播放| 中文字幕日本欧美| 美女少妇精品视频| 久久久精品亚洲| 色综合视频网站| 亚洲第一中文字幕在线观看| 91精品久久久久久久久久久| 欧美成人精品在线播放| 视频在线观看99| 91青草视频久久| 久久久久国产一区二区三区| 国产精品久久久久久久av大片| 国产在线播放91| 亚洲天堂av高清| 久热精品视频在线观看| 成人黄色大片在线免费观看| 精品国产欧美成人夜夜嗨| 美女视频久久黄| 亚洲精品少妇网址| 亚洲美女福利视频网站| 国产成人鲁鲁免费视频a| 久青草国产97香蕉在线视频| 美女久久久久久久| 欧美亚洲激情在线| 国产精品视频999| 啪一啪鲁一鲁2019在线视频| 亚洲成人av在线| 欧美视频精品一区|