一、建造者模式的概念 建造者模式屬于創(chuàng)建型設(shè)計(jì)模式。 指的是將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 建造者模式主要解決在軟件系統(tǒng)中,有時(shí)候面臨著"一個(gè)復(fù)雜對象"的創(chuàng)建工作,其通常由各個(gè)部分的子對象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對穩(wěn)定。 建造者模式主要涉及幾個(gè)角色: 1、指揮者(Director),負(fù)責(zé)和客戶(Client)對話 2、之后指揮者將客戶的產(chǎn)品需求劃分為比較穩(wěn)定的建造過程(AbstractBuilder) 3、指揮者指揮具體的建造者(ConcreteBuilder)干活 4、獲取建造者建造的產(chǎn)品給客戶 比如組裝電腦這個(gè)場景,CPU、主板、硬盤和內(nèi)存等配件是相對穩(wěn)定的,組裝過程也是相當(dāng)穩(wěn)定的,先裝CPU、內(nèi)存、硬盤和電源等等(AbstractBuilder),但是配件搭配的方式是多變的(Builder可以多個(gè)),如組裝家用電腦、游戲電腦。 二、建造者模式的實(shí)現(xiàn) 1、先來一個(gè)產(chǎn)品類(電腦) namespace BuilderPattern
{
using System;
using System.Collections.Generic;
/// <summary>
/// 電腦類
/// </summary>
public class Computer
{
/// <summary>
/// 電腦組件集合
/// </summary>
private readonly IList<string> parts = new List<string>();
/// <summary>
/// 把單個(gè)組件添加到電腦組件集合中
/// </summary>
/// <param name="part">組件</param>
public void Add(string part)
{
this.parts.Add(part);
}
public void Show()
{
Console.WriteLine("電腦組件清單:");
foreach (var part in this.parts)
{
Console.WriteLine($"組件:{part}");
}
Console.WriteLine("****************");
}
}
}
2、再來一個(gè)抽象Builder、兩個(gè)具體的Builder namespace BuilderPattern
{
/// <summary>
/// 抽象建造者
/// </summary>
public abstract class AbstractBuilder
{
/// <summary>
/// 裝CPU
/// </summary>
public abstract void BuildPartCPU();
/// <summary>
/// 裝主板
/// </summary>
public abstract void BuildPartMainBoard();
/// <summary>
/// 獲得組裝好的電腦
/// </summary>
/// <returns>電腦</returns>
public abstract Computer GetComputer();
}
}
namespace BuilderPattern
{
/// <summary>
/// 具體建造者,具體的某個(gè)人為具體創(chuàng)建者,例如:裝機(jī)小王
/// </summary>
public class ConcreteBuilder1 : AbstractBuilder
{
private readonly Computer computer = new Computer();
public override void BuildPartCPU()
{
this.computer.Add("CPU1");
}
public override void BuildPartMainBoard()
{
this.computer.Add("Main board1");
}
public override Computer GetComputer()
{
return this.computer;
}
}
}
namespace BuilderPattern
{
/// <summary>
/// 具體建造者,具體的某個(gè)人為具體創(chuàng)建者,例如:裝機(jī)小李啊
/// </summary>
public class ConcreteBuilder2 : AbstractBuilder
{
private readonly Computer computer = new Computer();
public override void BuildPartCPU()
{
this.computer.Add("CPU2");
}
public override void BuildPartMainBoard()
{
this.computer.Add("Main board2");
}
public override Computer GetComputer()
{
return this.computer;
}
}
}
3、指揮者登場(BOSS) namespace BuilderPattern
{
/// <summary>
/// 指揮者
/// </summary>
public class Director
{
/// <summary>
/// 組裝電腦
/// </summary>
/// <param name="abstractBuilder">建造者</param>
public void Construct(AbstractBuilder abstractBuilder)
{
abstractBuilder.BuildPartCPU();
abstractBuilder.BuildPartMainBoard();
}
}
}
3、使用 namespace BuilderPattern
{
using System;
class Program
{
static void Main(string[] args)
{
// 客戶找到電腦城老板說要買電腦,這里要裝兩臺(tái)電腦
// 創(chuàng)建指揮者和構(gòu)造者
var director = new Director();
AbstractBuilder b1 = new ConcreteBuilder1();
AbstractBuilder b2 = new ConcreteBuilder2();
Console.WriteLine("開始組裝第一臺(tái)電腦");
director.Construct(b1);
Console.WriteLine("獲取第一臺(tái)電腦");
var computer1 = b1.GetComputer();
computer1.Show();
Console.WriteLine("開始組裝第二臺(tái)電腦");
director.Construct(b2);
Console.WriteLine("獲取第二臺(tái)電腦");
var computer2 = b2.GetComputer();
computer2.Show();
Console.Read();
}
}
}
結(jié)果如下: 三、總結(jié) 以上組裝電腦的過程,把電腦零件和電腦組裝分離了,電腦組裝和電腦組裝過程分離了,也就是我們常說的解耦。 BOSS可以隨時(shí)修改電腦的組裝過程,不影響交付給客戶的產(chǎn)品;也可以隨時(shí)換掉組裝電腦的人(ConcreteBuilder1和ConcreBuilder2),不再依賴具體的人。也就是不依賴細(xì)節(jié),都依賴于抽象,使整個(gè)電腦組裝過程更穩(wěn)定。 建造者模式適用于所創(chuàng)建的產(chǎn)品具有較多的共同點(diǎn),其組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,如造飛機(jī)和裝電腦。 |
|