建筑者模式
- 1.管理者或叫指导者Director(并调具体建筑者去创建产品)
- 2.建筑者Buidler(抽象类,抽象了生成产品结构化过程)
- 3.具体建筑者ConcreteBuilder(具体生成产品,实现建筑者)
- 4.产品Product(产品内部各个部分的构成经常变化)
描述:在软件系统中,经常面临着复杂的对象的创建工作,它通常由各个部分子对象经过一定的算法构成。这个复杂的对象的各个部分经常面临着剧烈的变化,而将它们组合在一起的算法相对稳定。如何应对这种变化?《 建筑者模式》:把复杂对象(Product)内部各个剧烈变化的部分封装(Builder)“隔绝出来”,保持系统“稳定构造算法”不随着需求的变化而变化。
实现:把复杂的构造和表示相分离,同样的构造过程可以创建不同的表示。
类图
流程图
实际的例子:
模拟小米手机的生成过程:小米手机分为高端的小米手机和低端的红米手机,生产手机的过程(屏幕+主版+电池等)是相同,所用的材料不相同。
所有生成的产品
/// <summary> /// 手机类(产品) /// </summary> public class Mobile { readonly Dictionary<string,string> _mobel=new Dictionary<string, string>(); public void Add(string partName, string partVal) { _mobel.Add(partName, partVal); } public void Show() { Console.WriteLine("这个一台生成完毕的手机,下面是手机的信息"); var mobileParts = _mobel.GetEnumerator(); Console.WriteLine(mobileParts.Current.Key+":"+mobileParts.Current.Value); while (mobileParts.MoveNext()) { Console.WriteLine(mobileParts.Current.Key + ":" + mobileParts.Current.Value); } } }
建筑者Builer
/// <summary> /// 手机建造者(抽象的建造者) /// </summary> public abstract class Builder { /// <summary> /// 生产第一部分 /// </summary> public abstract void PartA(); /// <summary> /// 生产第二个部分 /// </summary> public abstract void PartB(); /// <summary> /// 生产第三个部分 /// </summary> public abstract void PartC(); /// <summary> /// 返回产品 /// </summary> /// <returns></returns> public abstract Mobile GetProduct(); }
具体建造者
/// <summary> /// 具体建造者(红米手机具体建造者) /// </summary> public class ConcreteRedMiBuilder:Builder { readonly Mobile _mobile=new Mobile(); public override void PartA() { _mobile.Add("屏幕","720p"); } public override void PartB() { _mobile.Add("主板", "红米特供"); } public override void PartC() { _mobile.Add("电磁", "2500m"); } public override Mobile GetProduct() { return _mobile; } }
/// <summary> /// 小米手机的具体工厂 /// </summary> public class ConcreteSmillMiBuilder:Builder { private Mobile _mobile=new Mobile(); public override void PartA() { _mobile.Add("屏幕","1080p"); } public override void PartB() { _mobile.Add("主板", "小米特供"); } public override void PartC() { _mobile.Add("电池", "3100m"); } public override Mobile GetProduct() { return _mobile; } }
管理者
/// <summary> /// 管理者 /// </summary> public class Director { /// <summary> /// 执行手机生产的各个部分 /// </summary> /// <param name="builder"></param> public void Construct(Builder builder) { builder.PartA(); builder.PartB(); builder.PartC(); } }
最后是客户端调用代码
class Program { static void Main(string[] args) { Console.WriteLine("请输入产品的编码 1红米 2小米"); string no =Console.ReadLine(); string builderName = ConfigurationSettings.AppSettings["No" + no]; Builder.Builder instance = (Builder.Builder)Assembly.Load("Builder").CreateInstance("Builder." + builderName); Director director=new Director(); director.Construct(instance); Mobile mobile = instance.GetProduct(); mobile.Show(); Console.ReadLine(); } }
项目的代码:建造者模式.zip