設計模式(C#)——建造者模式
推薦閱讀:
當一個複雜物件由一些子物件構成,並且子物件的變化會導致複雜物件的修改。這時我們需要提供一種"封裝機制"來隔離出"複雜物件的各個部分"的變化,從而保持系統中的"穩定構建演算法"不隨需求的改變而改變,這就是今天要給大家分享的建造者模式。
建造者模式(Builder Pattern)
建造者模式屬於建立型模式,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
建造者模式要素:
1、抽象建造者(Builder):給出一個抽象結論,以規範產品物件的各個組成成分的建造。這個介面規定要實現複雜物件的那些部分的建立,並不涉及具體的物件部件的建立;
2、具體建造者(Concrete Builder):實現建造者介面,針對不同的商業邏輯,具體化複雜物件的各部分的建立。在構造過程完成後,提供產品的例項;
3、指導者(Director):呼叫具體建造者來建立複雜物件的各個部分,在指導者中不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立;
4、產品類(Product):需要建立的具體的複雜物件。
下面舉個例子來為大家講解一下吧。
名稱空間建造者模式中包含Phone手機類充當產品類,Builder基類為抽象建造者,華為HF類、小米XM類、魅族MZ類。另外包含1個手機擴充套件類和1個指導者。本示例向大家演示3個不同的手機廠商在生產比較複雜的汽車時所採用的策略。
理清了這個邏輯過程之後,下面就具體看下如何用程式碼來表示這種現實生活中的邏輯過程:
1.建立抽象建造者Builder
public abstract class Builder { protected phone = new Phone();//手機 public abstract void BuildCPU();//CPU public abstract void BuildBattery();//電池 public abstract void BuildSpeaker();//揚聲器 public abstract void BuildColor();//顏色 public virtual Phone GetPhone() { return phone; } }
2.具體建造者(CPU,Battery,Speaker,Color)
public class HW : Builder {
public override void BuildCPU() {
phone.Carframe = "華為的處理器";
}
public override void BuildBattery() {
phone.Battery = 3000;
}
public override void BuildSpeaker() {
phone.Speaker= "華為的揚聲器";
}
public override void BuildColor() {
phone.Color= "華為的專屬顏色";
}
}
public class XM : Builder {
public override void BuildCPU() {
phone.Carframe = "小米的處理器";
}
public override void BuildBattery() {
phone.Battery = 3500;
}
public override void BuildSpeaker() {
phone.Speaker= "小米的揚聲器";
}
public override void BuildColor() {
phone.Color= "小米的專屬顏色";
}
}
public class MZ : Builder {
public override void BuildCPU() {
phone.Carframe = "魅族的處理器";
}
public override void BuildBattery() {
phone.Battery = 2500;
}
public override void BuildSpeaker() {
phone.Speaker= "魅族的揚聲器";
}
public override void BuildColor() {
phone.Color= "魅族的專屬顏色";
}
}
3.指導者Director
public class Director {
public void Construct(Builder builder) {
builder.BuildCPU();
builder.BuildBattery();
builder.BuildSpeaker();
builder.BuildColor();
}
}
4.一個擴充套件類
public static class Extentions {
public static string VehicleInfo(this Vehicle vehicle) {
var type = vehicle.GetType();
var properties = type.GetProperties();
var result = string.Empty;
foreach (var prop in properties) {
result +=
$"{prop.Name}:{prop.GetValue(vehicle, null)}{Environment.NewLine}";
}
return result;
}
}
5.呼叫方的程式碼,分別維持對指導者、建造者和手機的引用,接下來我們建立了3部手機。
public class Program {
private static Director _director = null;
private static List<Builder> _builders = null;
private static Phone _phone = null;
public static void Main(string[] args) {
_director = new Director();
_phone = new Phone ();
_builders = new List<Builder>() {
new HW(),
new XM(),
new MZ()
};
foreach (var builder in _builders) {
_director.Construct(builder);
_phone = builder.GetResult();
_phone .Print();
}
Console.ReadKey();
}
}
上面,我們介紹完了建造者模式的具體實現之後,最後讓我們總結下建造模式的實現要點:
1.在建造者模式中,指揮者是直接與客戶端打交道的,指揮者將客戶端建立產品的請求劃分為對各個部件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工作的,卻不為客戶所知道。
2.。建造者模式主要用於“分步驟來構建一個複雜的物件”,其中“分步驟”是一個固定的組合過程,而複雜物件的各個部分是經常變化的(也就是說電腦的內部元件是經常變化的,這裡指的的變化如硬碟的大小變了,CPU由單核變雙核等)。
3.產品不需要抽象類,由於建造模式的創建出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類。
4.在前面文章中介紹的抽象工廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。
5.由於建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成元件的需求變化。