建造者模式(Builder) 類圖 描述 建造者: Builder:定義一個建造者抽象類,以規範產品對象的各個組成部分的建造。這個介面規定要實現對象的哪些部分的創建,並不涉及具體的對象部件的創建。 ConcreteBuilder:繼承Builder,針對不同的業務邏輯,具體化對象的各部分的創建。在建 ...
建造者模式(Builder)
類圖
描述
建造者:
Builder:定義一個建造者抽象類,以規範產品對象的各個組成部分的建造。這個介面規定要實現對象的哪些部分的創建,並不涉及具體的對象部件的創建。
ConcreteBuilder:繼承Builder,針對不同的業務邏輯,具體化對象的各部分的創建。在建造過程完成後,提供產品的實例。
Director:調用具體建造者來創建對象的各個部分,在指導者中不涉及具體產品的信息,只負責保證對象各部分完整創建或按某種順序創建。
Product:要創建的對象。
應用場景
還是以生產轎車為例,建造者負責生產各個部件,而指揮者負責指揮建造者按流程組裝轎車。
由此可見,建造者模式僅僅只比工廠模式多了一個"Director類"的角色。
轎車及各部件類
public class Body { public string Description { get; set; } } public class Engine { public string Description { get; set; } } public class Wheel { public string Description { get; set; } } public class Car { public Body body { get; set; } public Engine engine { get; set; } public Wheel wheel { get; set; } }
建造者介面
public interface IBuilder { void BuildBody(); void BuildEngine(); void BuildWheel(); Car CreateCar(); }
建造者類
public class BuilderAudi : IBuilder { private Car car = new Car(); public void BuildBody() { car.body = new Body() { Description = "奧迪的車身結構." }; Console.WriteLine(string.Format("安裝{0}", car.body.Description)); } public void BuildEngine() { car.engine = new Engine() { Description = "奧迪的發動機." }; Console.WriteLine(string.Format("安裝{0}", car.engine.Description)); } public void BuildWheel() { car.wheel = new Wheel() { Description = "奧迪的車輪." }; Console.WriteLine(string.Format("安裝{0}", car.wheel.Description)); } public Car CreateCar() { Console.WriteLine("奧迪車安裝完成."); return car; } } public class BuilderBenz : IBuilder { private Car car = new Car(); public void BuildBody() { car.body = new Body() { Description = "賓士的車身結構." }; Console.WriteLine(string.Format("安裝{0}", car.body.Description)); } public void BuildEngine() { car.engine = new Engine() { Description = "賓士的發動機." }; Console.WriteLine(string.Format("安裝{0}", car.engine.Description)); } public void BuildWheel() { car.wheel = new Wheel() { Description = "賓士的車輪." }; Console.WriteLine(string.Format("安裝{0}", car.wheel.Description)); } public Car CreateCar() { Console.WriteLine("賓士車安裝完成."); return car; } }
指揮者類
public class Director { public void Constrcut(IBuilder builder) { builder.BuildBody(); builder.BuildEngine(); builder.BuildWheel(); } }
調用
Director director = new Director(); string value = ConfigurationManager.AppSettings["builderPattern"]; IBuilder builder = (IBuilder)Assembly.Load(value.Substring(0, value.IndexOf('.'))).CreateInstance(value); director.Constrcut(builder); Car car = builder.CreateCar();