标签:err 技术分享 ted 品牌 oid 抽象工厂 const rod dir
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
采购经理要采购一批台式电脑,为了节约公司成本,决定组装。但是对于怎么组装,采购经理不知道也不关心,所以就指派装机商组装。第一次采购的电脑是组装的HP的台式机,
第二次采购经理决定换个品牌,组装DELL的台式机。对于怎么组装HP、DELL台式机,采购经理不关心。
先看看产品Product,电脑的实现。
/// <summary> /// 产品类 /// </summary> public class Computer { /// <summary> /// 品牌 /// </summary> public string Band { get; set; } /// <summary> /// 电脑组件列表 /// </summary> private List<string> assemblyParts = new List<string>(); /// <summary> /// 组装部件 /// </summary> /// <param name="partName">部件名称</param> public void AssemblePart(string partName) { this.assemblyParts.Add(partName); } public void ShowSteps() { Console.WriteLine("开始组装『{0}』电脑:", Band); foreach (var part in assemblyParts) { Console.WriteLine(string.Format("组装『{0}』;", part)); } Console.WriteLine("组装『{0}』电脑完毕!", Band); } }
接下来看Builder角色,即电脑组装商抽象类。
/// <summary> /// 建造者(模拟装机过程),也可通过接口实现 /// Director不关心具体组装的细节,所以将具体的组装细节方法标记为protected /// </summary> public abstract class Builder { /// <summary> /// 组装主机 /// </summary> protected abstract void BuildMainFramePart(); /// <summary> /// 组装显示器 /// </summary> protected abstract void BuildScreenPart(); /// <summary> /// 组装输入设备(键鼠) /// </summary> protected abstract void BuildInputPart(); /// <summary> /// 获取组装电脑 /// 由具体的组装类决定组装顺序 /// </summary> /// <returns></returns> public abstract Computer BuildComputer(); }
再看看具体的ConcreteBuilder角色,HP电脑组装商的实现
/// <summary> /// 惠普电脑组装商 /// </summary> public class HpBulider : Builder { Computer hp = new Computer() { Band = "惠普" }; protected override void BuildMainFramePart() { hp.AssemblePart("主机"); } protected override void BuildScreenPart() { hp.AssemblePart("显示器"); } protected override void BuildInputPart() { hp.AssemblePart("键鼠"); } /// <summary> /// 决定具体的组装步骤 /// </summary> /// <returns></returns> public override Computer BuildComputer() { BuildMainFramePart(); BuildScreenPart(); BuildInputPart(); return hp; } }
最后只等指挥者Director一声令下,组装电脑。看看指挥者的实现。
/// <summary> /// 指挥者(采购经理) /// </summary> public class Director { public Computer Construct(Builder builder) { return builder.BuildComputer(); } }
建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品部件的需求变化。
抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
建造者模式关注的是零件类型和装配工艺(顺序)。最主要的功能是基本方法的调用顺序安排。
标签:err 技术分享 ted 品牌 oid 抽象工厂 const rod dir
原文地址:http://www.cnblogs.com/pangjianxin/p/7912783.html