建造者模式(Builder)
定义
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
类图
描述
Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造。这个接口规定要实现对象的哪些部分的创建,并不涉及具体的对象部件的创建。
ConcreteBuilder:继承Builder,针对不同的业务逻辑,具体化对象的各部分的创建。在建造过程完成后,提供产品的实例。
Director:调用具体建造者来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
Product:要创建的对象。
建造者模式仅仅只比工厂模式多了一个"Director类"的角色。
应用场景
以生产轿车为例,建造者负责生产汽车的各个部件,而指挥者负责指挥建造者按流程组装轿车。
/// <summary> /// 发动机 /// </summary> public class Engine { public string Description { get; set; } } /// <summary> /// 车体结构 /// </summary> public class Body { public string Description { get; set; } } /// <summary> /// 车轮 /// </summary> public class Wheel { public string Description { get; set; } } /// <summary> /// 汽车 /// </summary> public class Car { public Body body { get; set; } public Engine engine { get; set; } public Wheel wheel { get; set; } } /// <summary> /// 建造者接口 /// </summary> public interface IBuilder { void BuildBody(); void BuildEngine(); void BuildWheel(); Car CreateCar(); } /// <summary> /// 奥迪建造者 /// </summary> 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; } } /// <summary> /// 奔驰建造者 /// </summary> 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; } } /// <summary> /// 指挥者 /// </summary> public class Director { public void Constrcut(IBuilder builder) { builder.BuildBody(); builder.BuildEngine(); builder.BuildWheel(); } }