將一個複雜的對象的構建與它的表示分離,使得一樣的構建過程建立出不一樣的表示。算法
與工廠模式相比,更加關注與零配件的裝配順序。ide
1.結構類圖的實現ui
Product類,產品類,由多個部件組成spa
/// <summary> /// 產品類 /// </summary> public class Product { List<string> parts = new List<string>(); /// <summary> /// 添加產品部件 /// </summary> /// <param name="part"></param> public void AddPart(string part) { parts.Add(part); } /// <summary> /// 列舉全部產品部件 /// </summary> public void Show() { Console.WriteLine("產品建立-----------"); parts.ForEach(x => Console.WriteLine(x)); } }
Builder類,抽象建造者類,肯定產品是由兩個部件PartA和PartB組成,並聲明一個獲得產品建造後的結果的方法GetResult()code
/// <summary> /// 抽象建造者類 /// </summary> public abstract class Builder { /// <summary> /// 部件A /// </summary> public abstract void BuildPartA(); /// <summary> /// 部件B /// </summary> public abstract void BuildPartB(); /// <summary> /// 獲取產品 /// </summary> /// <returns>具體產品</returns> public abstract Product GetResult(); }
ConcreteBuilder類,具體的建造者類對象
public class ConcreteBuilder1 : Builder { private Product product = new Product(); public override void BuildPartA() { product.AddPart("部件A"); } public override void BuildPartB() { product.AddPart("部件B"); } public override Product GetResult() { return product; } } public class ConcreteBuilder2 : Builder { private Product product = new Product(); public override void BuildPartA() { product.AddPart("部件X"); } public override void BuildPartB() { product.AddPart("部件Y"); } public override Product GetResult() { return product; } }
Director類,指揮者類,規範產品部件生成的順序blog
/// <summary> /// 指揮者類 /// </summary> public class Director { public void Construct(Builder builder) { builder.BuildPartA(); builder.BuildPartB(); } }
客戶端string
Director director = new Director(); ConcreteBuilder1 builder1 = new ConcreteBuilder1(); director.Construct(builder1); Product p1 = builder1.GetResult(); p1.Show(); ConcreteBuilder2 builder2 = new ConcreteBuilder2(); director.Construct(builder2); Product p2 = builder2.GetResult(); p2.Show();
結果產品
2.建造者模式之西安美食it
去西安必需要吃的就是涼皮,肉夾饃,羊肉泡饃...,這些美食會以套餐的造成展現給咱們,不一樣的套餐就是【Product】,一道道美食就是組成【Product】的部件;不一樣的組合方式就是【Builder】,廚師【Director】將他們搭配起來。
套餐
/// <summary> /// 套餐 /// </summary> public class Meal { List<string> parts = new List<string>(); public void AddPart(string part) { parts.Add(part); } public void Show() { Console.WriteLine("您的套餐齊了:"); parts.ForEach(x => Console.Write(x + " ")); Console.WriteLine("\n**************"); } }
套餐建立的抽象類
/// <summary> /// 建立套餐 /// </summary> public abstract class BuildMeal { protected Meal meal = new Meal(); public abstract void BuildePartA(); public abstract void BuildePartB(); public abstract void BuildePartC(); public Meal GetMeal() { return meal; } }
具體套餐的建立
/// <summary> /// 經典套餐 /// </summary> public class BuildClassicalMeal : BuildMeal { public override void BuildePartA() { meal.AddPart("肉夾饃"); } public override void BuildePartB() { meal.AddPart("涼皮"); } public override void BuildePartC() { meal.AddPart("冰峯"); } } /// <summary> /// 豪華套餐 /// </summary> public class BuildLuxuriousMeal : BuildMeal { public override void BuildePartA() { meal.AddPart("羊肉泡饃"); } public override void BuildePartB() { meal.AddPart("糖蒜"); } public override void BuildePartC() { meal.AddPart("黑米粥"); } }
廚師裝配
/// <summary> /// 廚師 /// </summary> public class Chef { /// <summary> /// 生成套餐的過程 /// </summary> /// <param name="buildMeal"></param> public void GiveMeal(BuildMeal buildMeal) { buildMeal.BuildePartA(); buildMeal.BuildePartB(); buildMeal.BuildePartC(); } }
客戶端
Chef chef = new Chef(); BuildClassicalMeal buildClassical = new BuildClassicalMeal(); chef.GiveMeal(buildClassical); Meal classicalMeal = buildClassical.GetMeal(); classicalMeal.Show(); BuildLuxuriousMeal buildLuxurious = new BuildLuxuriousMeal(); chef.GiveMeal(buildLuxurious); Meal luxuriousMeal = buildLuxurious.GetMeal(); luxuriousMeal.Show();
結果
請 多多指教~(看過記獲得西安去品嚐喲)