標籤:大小 變化 ide 方式 指定 over rtm etc 需求變化
1、建造者模式簡介
1.1>、定義
建造者模式(Builder)將複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。
1.2>、使用頻率
中低
1.3>、原型模式應用
在軟體系統中,有時候面臨一個複雜物件的建立工作,該對象通常由各個部分子物件用一定的演算法構成,或者按一定的步驟組合而成;這些演算法和步驟是穩定的,而構成這個對象的子物件卻經常由於需求的變化而不斷變化。
生活中的例子,要組裝一台電腦,它的組裝過程基本是不變的,都可以由主板、CPU、記憶體等按照某個穩定方式組合而成。然而主板、CPU、記憶體等零件本身都是可能多變的。將記憶體等這種易變的零件與電腦的其他組件分離,實現解耦合,則可以輕鬆實現電腦不斷升級。
2、建造者模式結構
2.1>、結構圖
2.2>、參與者
建造者模式參與者:
? Builder:為建立一個Product對象的各個組件指定抽象介面;
? ConcreteBuilder
° 實現Builder的介面以構造和裝配該產品的各個組件
° 定義並明確它所建立的表示
° 提供一個檢索Product的介面
? Director:構造一個使用Builder介面的對象;
? Product
° 表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程
° 包含定義組成組件的類,包括將這些組件裝配成最終產品的介面
在建造者模式中,Director規定了建立一個對象所需要的步驟和次序,Builder則提供了一些列完成這些步驟的方法,ConcreteBuilder給出了這些方法的具體實現,是對象的直接建立者。
using System;using System.Collections.Generic;using System.Linq;using System.Text;/// <summary>/// 以組裝電腦為例子/// 每台電腦的組成過程都是一致的,但是使用同樣的構建過程可以建立不同的表示(即可以組裝成不一樣的電腦,配置不一樣)/// 組裝電腦的這個情境就可以應用建造者模式來設計/// </summary>namespace 設計模式之建造者模式{ /// <summary> /// 客戶類 /// </summary> class Customer { static void Main(string[] args) { // 客戶找到電腦城老闆說要買電腦,這裡要裝兩台電腦 // 建立指揮者和構造者 Director director = new Director(); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2(); // 老闆叫員工去組裝第一台電腦 director.Construct(b1); // 組裝完,組裝人員搬來組裝好的電腦 Computer computer1 = b1.GetComputer(); computer1.Show(); // 老闆叫員工去組裝第二台電腦 director.Construct(b2); Computer computer2 = b2.GetComputer(); computer2.Show(); Console.Read(); } } /// <summary> /// 小王和小李難道會自願地去組裝嘛,誰不想休息的,這必須有一個人叫他們去組裝才會去的 /// 這個人當然就是老闆了,也就是建造者模式中的指揮者 /// 指揮建立過程類 /// </summary> public class Director { // 組裝電腦 public void Construct(Builder builder) { builder.BuildPartCPU(); builder.BuildPartMainBoard(); } } /// <summary> /// 電腦類 /// </summary> public class Computer { // 電腦組件集合 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("電腦組裝好了"); } } /// <summary> /// 抽象建造者,這個情境下為 "組裝人" ,這裡也可以定義為介面 /// </summary> public abstract class Builder { // 裝CPU public abstract void BuildPartCPU(); // 裝主板 public abstract void BuildPartMainBoard(); // 當然還有裝硬碟,電源等組件,這裡省略 // 獲得組裝好的電腦 public abstract Computer GetComputer(); } /// <summary> /// 具體建立者,具體的某個人為具體建立者,例如:裝機小王啊 /// </summary> public class ConcreteBuilder1 : Builder { Computer computer = new Computer(); public override void BuildPartCPU() { computer.Add("CPU1"); } public override void BuildPartMainBoard() { computer.Add("Main board1"); } public override Computer GetComputer() { return computer; } } /// <summary> /// 具體建立者,具體的某個人為具體建立者,例如:裝機小李啊 /// 又裝另一台電腦了 /// </summary> public class ConcreteBuilder2 : Builder { Computer computer = new Computer(); public override void BuildPartCPU() { computer.Add("CPU2"); } public override void BuildPartMainBoard() { computer.Add("Main board2"); } public override Computer GetComputer() { return computer; } }}
3、建造者模式分析
介紹完了建造者模式的具體實現之後,讓我們總結下建造模式的實現要點:
- 在建造者模式中,指揮者是直接與用戶端打交道的,指揮者將用戶端建立產品的請求劃分為對各個組件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工作的,卻不為客戶所知道。
- 建造者模式主要用於“分步驟來構建一個複雜的對象”,其中“分步驟”是一個固定的組合過程,而複雜物件的各個部分是經常變化的(也就是說電腦的內部組件是經常變化的,這裡指的的變化如硬碟的大小變了,CPU由單核變雙核等)。
- 產品不需要抽象類別,由於建造模式的建立出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類。
- 在前面文章中介紹的抽象原廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。
- 由於建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成組件的需求變化。
C#設計模式——建造者模式(Builder Pattern)