目標(biāo):將一個復(fù)雜對象的構(gòu)建與表示分離晰筛,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
使用場景:典型的KFC兒童餐包括一個主食恩袱,一個輔食,一杯飲料和一個玩具(例如漢堡胶哲、炸雞畔塔、可樂和玩具車)。這些在不同的兒童餐中可以是不同的鸯屿,但是組合成兒童餐的過程是相同的澈吨。
優(yōu)點(diǎn):
- 使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。
- 具體的建造者類之間是相互獨(dú)立的寄摆,對系統(tǒng)的擴(kuò)展非常有利谅辣。
- 由于具體的建造過程的獨(dú)立的,因此可以對建造過程逐步細(xì)化婶恼,而不對其他模塊產(chǎn)生影響桑阶。
實(shí)現(xiàn):
- Builder:抽象建造者。他聲明為創(chuàng)建一個Product對象的各個部件指定的抽象接口勾邦。
- ConcreateBuilder:具體建造者蚣录。實(shí)現(xiàn)抽象接口,構(gòu)建和裝配各個部件眷篇。
- Director:指揮者萎河。構(gòu)建一個使用Builder接口的對象。它主要是用于創(chuàng)建一個復(fù)雜的對象铅歼,它主要有兩個作用,一是:隔離了客戶與對象的生產(chǎn)過程换可,二是:負(fù)責(zé)控制產(chǎn)品對象的生產(chǎn)過程椎椰。
-
Product:產(chǎn)品角色。一個具體的產(chǎn)品對象沾鳄。
image.png
public class BuilderTest
{
/***
* 抽象的建造者只關(guān)心對象有哪些步驟慨飘,
* 具體的建造者只關(guān)心如何實(shí)現(xiàn)每一個具體的步驟,
* 指揮者只關(guān)心構(gòu)建的順序,
* 三方各司其職瓤的,很好的隔離了構(gòu)建對象的步驟和順序休弃,
* 一但指揮者和建造者確定了,開發(fā)者只需要關(guān)心如何實(shí)現(xiàn)和更新具體步驟就行了圈膏,
*/
public static void Test()
{
Builder builder1 = new ConcreteBuilder();
Director director = new Director(builder1);
director.Consttruct();
var product = builder1.GetResult();
product.Show();
}
/// <summary>
/// 抽象的建造者,定義了建造者的執(zhí)行步驟
/// </summary>
public abstract class Builder
{
/// <summary>
/// 構(gòu)建的步驟
/// </summary>
public abstract void BuidPart1();
public abstract void BuidPart2();
public abstract void BuidPart3();
/// <summary>
/// 構(gòu)建完成后的
/// </summary>
/// <returns></returns>
public abstract Product GetResult();
}
/// <summary>
/// 具體的建造者
/// </summary>
public class ConcreteBuilder : Builder
{
Product product;
public ConcreteBuilder()
{
product = new Product();
}
/// <summary>
/// 具體實(shí)現(xiàn)構(gòu)建產(chǎn)品的步驟
/// </summary>
public override void BuidPart1()
{
product.AddPart("步驟1");
}
public override void BuidPart2()
{
product.AddPart("步驟2");
}
public override void BuidPart3()
{
product.AddPart("步驟3");
}
/// <summary>
/// 返回構(gòu)建完成的產(chǎn)品
/// </summary>
/// <returns></returns>
public override Product GetResult()
{
return product;
}
}
/// <summary>
/// 產(chǎn)品
/// </summary>
public class Product
{
public List<string> parts;
public Product()
{
this.parts = new List<string>();
}
/// <summary>
/// 安裝零件
/// </summary>
/// <param name="part"></param>
public void AddPart(string part)
{
this.parts.Add(part);
}
/// <summary>
/// 展示產(chǎn)品
/// </summary>
public void Show()
{
this.parts.ForEach(p => Console.WriteLine(p));
}
}
/// <summary>
/// 指揮者 指揮某個建造者按照一定的順序組裝產(chǎn)品
/// </summary>
public class Director
{
Builder builder;
/// <summary>
/// 和 builder是 聚合關(guān)系塔猾,builder是觀察者的一個組成部分
/// </summary>
/// <param name="builder"></param>
public Director(Builder builder)
{
this.builder = builder;
}
/// <summary>
/// 指揮者開始建造
/// </summary>
public void Consttruct()
{
//定義建造者的建造順序
builder.BuidPart1();
builder.BuidPart3();
builder.BuidPart2();
}
}
}