建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
模式结构
建造者模式的好处:
建造者模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。
何时使用建造者模式?
主要是用于创建一些复杂的对象,这些对象内部构建间的构造顺序通常是稳定的,但对象内部的构件通常面临着复杂的变化。
示例
某年,中央电视台举办的春节联欢晚会上的一个小品,有这样一个情节:宋丹丹给赵本山出个题儿--如何把大象装到冰箱里,赵本山没答上。宋丹丹告诉赵本山标准答案:第一步把冰箱门打开,第二步把大象放进去,第三步把冰箱门关上。
同理,我们可以按照这个步骤,向冰箱里装其他东西:比如,过期的牛奶,吃剩的Pizza,甚至还可以模仿俄罗斯套娃,装个冰箱(冰箱的使用详见冰箱使用手册,I bet 冰箱绝对不是这样用的。。)。。下面来看一下装大象的代码:
namespace 把大象装冰箱 { /*首先抽象出一个建造过程的类,将把“东西装在冰箱” * 这个过程给稳定住。就是说,不管向冰箱里面装什么东西 * 都得按照这个步骤来,一步都不能丢。*/ abstract class PutIntoFridge { public abstract void OpenFridge(); public abstract void PutInto(); public abstract void CloseFridge(); } /*写一个把大象装冰箱的类,然后让这个类去继承PutIntoFridge * 在这个类里面,给出如何把大象装冰箱的具体实现。*/ class PutElephantIntoFri : PutIntoFridge { private string name; public PutElephantIntoFri(string name) { this.name = name; } public override void OpenFridge() { Console.WriteLine("打开了冰箱门~~"); } public override void PutInto() { Console.WriteLine("把 {0} 装进冰箱。", name); } public override void CloseFridge() { Console.WriteLine("把冰箱门关上了。"); } } /*指挥者:用来指挥把东西装冰箱这个过程,用它来隔离用户与 * 建造过程的关联。*/ class Director { private PutIntoFridge pif; //构造的时候指明要实现把什么东西装冰箱 public Director(PutIntoFridge pif) { this.pif = pif; } /*写一个把大象装冰箱的过程,用以隐藏具体的把大象装冰箱的过程 * 使用时只需调用这一个方法就行。*/ public void CreatePutIntoFif() { pif.OpenFridge(); pif.PutInto(); pif.CloseFridge(); } } class Program { static void Main(string[] args) { PutElephantIntoFri peif = new PutElephantIntoFri("小象"); Director director = new Director(peif); director.CreatePutIntoFif(); Console.WriteLine(" "); } } }
最后,运行一下,装冰箱成功。。。