设计模式-建造者模式详解
一、建造者模式的概念
建造者模式属于创建型设计模式。
指的是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
建造者模式主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
建造者模式主要涉及几个角色:
1、指挥者(director),负责和客户(client)对话
2、之后指挥者将客户的产品需求划分为比较稳定的建造过程(abstractbuilder)
3、指挥者指挥具体的建造者(concretebuilder)干活
4、获取建造者建造的产品给客户
比如组装电脑这个场景,cpu、主板、硬盘和内存等配件是相对稳定的,组装过程也是相当稳定的,先装cpu、内存、硬盘和电源等等(abstractbuilder),但是配件搭配的方式是多变的(builder可以多个),如组装家用电脑、游戏电脑。
二、建造者模式的实现
1、先来一个产品类(电脑)
namespace builderpattern { using system; using system.collections.generic; /// <summary> /// 电脑类 /// </summary> public class computer { /// <summary> /// 电脑组件集合 /// </summary> private readonly ilist<string> parts = new list<string>(); /// <summary> /// 把单个组件添加到电脑组件集合中 /// </summary> /// <param name="part">组件</param> public void add(string part) { this.parts.add(part); } public void show() { console.writeline("电脑组件清单:"); foreach (var part in this.parts) { console.writeline($"组件:{part}"); } console.writeline("****************"); } } }
2、再来一个抽象builder、两个具体的builder
namespace builderpattern { /// <summary> /// 抽象建造者 /// </summary> public abstract class abstractbuilder { /// <summary> /// 装cpu /// </summary> public abstract void buildpartcpu(); /// <summary> /// 装主板 /// </summary> public abstract void buildpartmainboard(); /// <summary> /// 获得组装好的电脑 /// </summary> /// <returns>电脑</returns> public abstract computer getcomputer(); } }
namespace builderpattern { /// <summary> /// 具体建造者,具体的某个人为具体创建者,例如:装机小王 /// </summary> public class concretebuilder1 : abstractbuilder { private readonly computer computer = new computer(); public override void buildpartcpu() { this.computer.add("cpu1"); } public override void buildpartmainboard() { this.computer.add("main board1"); } public override computer getcomputer() { return this.computer; } } }
namespace builderpattern { /// <summary> /// 具体建造者,具体的某个人为具体创建者,例如:装机小李啊 /// </summary> public class concretebuilder2 : abstractbuilder { private readonly computer computer = new computer(); public override void buildpartcpu() { this.computer.add("cpu2"); } public override void buildpartmainboard() { this.computer.add("main board2"); } public override computer getcomputer() { return this.computer; } } }
3、指挥者登场(boss)
namespace builderpattern { /// <summary> /// 指挥者 /// </summary> public class director { /// <summary> /// 组装电脑 /// </summary> /// <param name="abstractbuilder">建造者</param> public void construct(abstractbuilder abstractbuilder) { abstractbuilder.buildpartcpu(); abstractbuilder.buildpartmainboard(); } } }
3、使用
namespace builderpattern { using system; class program { static void main(string[] args) { // 客户找到电脑城老板说要买电脑,这里要装两台电脑 // 创建指挥者和构造者 var director = new director(); abstractbuilder b1 = new concretebuilder1(); abstractbuilder b2 = new concretebuilder2(); console.writeline("开始组装第一台电脑"); director.construct(b1); console.writeline("获取第一台电脑"); var computer1 = b1.getcomputer(); computer1.show(); console.writeline("开始组装第二台电脑"); director.construct(b2); console.writeline("获取第二台电脑"); var computer2 = b2.getcomputer(); computer2.show(); console.read(); } } }
结果如下:
三、总结
以上组装电脑的过程,把电脑零件和电脑组装分离了,电脑组装和电脑组装过程分离了,也就是我们常说的解耦。
boss可以随时修改电脑的组装过程,不影响交付给客户的产品;也可以随时换掉组装电脑的人(concretebuilder1和concrebuilder2),不再依赖具体的人。也就是不依赖细节,都依赖于抽象,使整个电脑组装过程更稳定。
建造者模式适用于所创建的产品具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,如造飞机和装电脑。
上一篇: 止咳汤有哪些止咳效果特别好
下一篇: 卤肉要卤多久才入味?你知道吗?