建造者模式(Builder Pattern),将一個複雜對象的建構與它的表示分離,使的同樣的建構過程可以建立不同的表示。
建造者模式的優點是:使得建造代碼與表示代碼分離,由于建造者隐藏了該産品是如何組裝的,是以如要改變一個産品的内部表示,隻需要再定義一個具體的建造者就可以了。
主要用于建立一些複雜的對象,這些對象内部建構間的建造順序通常是穩定的,但是對象内部的建構通常面臨着複雜的變化。

Product類:具體的産品。
Director類:指揮者,建構一個使用Builder接口的對象。
Builder接口:是為建立一個Product對象的各個元件指定的抽象接口
ConcreteBuilder類:具體的建造者,實作Builder接口,構造和裝配各個部
1、具體産品Product
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("産品完成建立");
}
2、抽象建造者Builder及其具體建造者ConcreteBuilder1,ConcreteBuilder2
public abstract class Builder
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
public class ConcreteBuilder1 : Builder
Product product = new Product();
public override void BuildPartA()
product.Add("A1");
public override void BuildPartB()
product.Add("B1");
public override Product GetResult()
return product;
public class ConcreteBuilder2 : Builder
product.Add("A2");
product.Add("B2");
3、指揮者類Director
/// <summary>
/// 指揮建造過程
/// </summary>
public class Director
public void Construct(Builder builder)
builder.BuildPartA();
builder.BuildPartB();
StringBuilder
4、用戶端代碼
static void Main(string[] args)
Director director = new Director();
Builder builder1 = new ConcreteBuilder1();
Builder builder2 = new ConcreteBuilder2();
director.Construct(builder1);
Product product1 = builder1.GetResult();
product1.Show();
director.Construct(builder2);
Product product2 = builder2.GetResult();
product2.Show();
Console.Read();
假設房子隻有房頂和牆(Roof And Walls)
Jane和 Joe兩個客戶需要從建造商Bob那裡買房子。Jane需要1個房頂(Roof)和4面牆(Walls)的房子,Joe需要1個房頂(Roof)和7面牆(Walls)的房子。建造商需要通過建造者模式實作客戶的個性要求。
此時建造商Bob(Contractor)就是指揮者(Director),TownHomeSubContractor和SingleFamilySubContractor就是建造者類(Builder Class),房子就是産品(House is Product).如下圖所示
House類:House is Pruduct
Contractor類,指揮者
MakeHouse()方法,指揮房子建造過程。
ISubConstractor接口,建造者接口,
AddRoof().添加房頂方法
AddWalls(),添加牆的方法
GetHouse(),獲得建構好的房子方法。
TownHomeSubContractor類,具體的建造者,實作建造者接口方法。
建造一個房頂和四面牆,以滿足Jane 的要求。
SingleFamilySubContractor類,具體的建造者,實作建造者接口方法。
建造一個房頂和七面牆,以滿足Joe的要求。
1、産品House
public class House
public string Roof { get; set; }
public string Walls { get; set; }
2、指揮者類Contractor
public class Contractor
public void MakeHouse(ISubContractor contractor)
contractor.AddRoof();
contractor.AddWalls();
3、抽象建造者ISubContractor及其具體建造者TownHomeSubContractor,SingleFamilySubContractor
//Sub Contractor interface (IBuilder)
public interface ISubContractor
void AddRoof();
void AddWalls();
House GetHouse();
//Concrete Builder Classes
public class TownHomeSubContractor : ISubContractor
private House _house = new House();
public void AddRoof()
_house.Roof = "Adding a small roof";
public void AddWalls()
_house.Walls = "Adding 4 Walls";
public House GetHouse()
return _house;
}
public class SingleFamilySubContractor : ISubContractor
_house.Roof = "Adding a large roof";
{
_house.Walls = "Adding 7 Walls";
}
//Jane wants a Town Home
Console.WriteLine("Building a Town Home for Jane..");
Contractor contractor = new Contractor();
ISubContractor subContractorTownHome = new TownHomeSubContractor();
contractor.MakeHouse(subContractorTownHome);
House townHome = subContractorTownHome.GetHouse();
Console.WriteLine(townHome.Roof + "..");
Console.WriteLine(townHome.Walls + "..");
//Joe wants a Single Family Home
Console.WriteLine("\nBuilding a Town Home for Joe..");
ISubContractor subContractorSingleFamily = new SingleFamilySubContractor();
contractor.MakeHouse(subContractorSingleFamily);
House singleFamilyHouse = subContractorSingleFamily.GetHouse();
Console.WriteLine(singleFamilyHouse.Roof + "..");
Console.WriteLine(singleFamilyHouse.Walls + "..");
建造者模式(Builder Pattern),将一個複雜對象的建構與它的表示分離,使的同樣的建構過程可以建立不同的表示。建造者模式是在當建立複雜對象的算法應該獨立于該對象的組成部分以及他們的裝配方式時适用的模式。
版權
作者:靈動生活 郝憲玮
如果你認為此文章有用,請點選底端的【推薦】讓其他人也了解此文章,
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。