设计模式之建造者模式(三)
设计模式之建造者模式(三)
今天来学习建造者模式,好像也有人叫生成器,一个意思.
一 概念
建造者模式:使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
二 介绍
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
三 图解
三 生活实例
下面我来举一个生活中的例子:
说到建造者模式,我想买电脑这个例子是比较贴切的.
假如你想买一些电脑配件自己来组装,电脑有很多配件,比如CPU,主板,机箱等等......但是你又不懂电脑的配件和组装,这时你来找我,因为你觉得我是个程序员,我比较懂,,,我确实比你懂,但是,我又比较懒,于是呢.我就给出了一个规范,找一个跑腿的按照这个规范去帮我买和组装...有点乱,没关系,再来捋一下,你就相当于导演这个角色(director),我就是你找来的抽象建造者(Builder),跑腿的就是具体的建造者(ConcreteBuilder),电脑就是最终要构建的产品
上边的图是copy别人的,捋清这个关系就行,下边我要写的代码的方法名可能和图片上不一样,不过没关系,看代码就能看懂
那再来提供一张图吧
四 代码展示
/// <summary> /// 主程序 /// </summary> class Program { static void Main(string[] args) { Builder builder = new ConcreBuilder(); Director director = new Director(builder); Computer computer = director.CreateComputer(); Console.WriteLine("电脑创建好了"); Console.WriteLine(computer.ToString()); Console.ReadKey(); } } ======================== /// <summary> /// 导演者 /// </summary> class Director { Builder builder; public Director(Builder b) { this.builder = b; } public Computer CreateComputer() { builder.BuildPart(); return builder.GetComputer(); } } ======================== /// <summary> /// 抽象建造者 /// </summary> interface Builder { //创建产品的方法 void BuildPart(); //拿到创建的产品 Computer GetComputer(); } ======================== /// <summary> /// 具体建造者 /// </summary> class ConcreBuilder : Builder { Computer computer = new Computer(); public void BuildPart() { computer.BuildCpu(); computer.BuildJiXiang(); computer.BuildZhuBan(); } public Computer GetComputer() { return computer; } } ======================== /// <summary> /// 电脑产品 /// </summary> class Computer { public string CPU { get; set; } public string ZhuBan { get; set; } public string JiXiang { get; set; } public void BuildCpu() { Console.WriteLine("正在创建CPU......"); this.CPU = "intel core i7"; Console.WriteLine("CPU创建完成......"); } public void BuildZhuBan() { Console.WriteLine("正在创建主板......"); this.ZhuBan = "华硕主板"; Console.WriteLine("主板创建完成......"); } public void BuildJiXiang() { Console.WriteLine("正在创建机箱......"); this.JiXiang = "手工定制机箱"; Console.WriteLine("机箱创建完成......"); } public override string ToString() { return "展示一下电脑配置: "+this.CPU+" "+this.ZhuBan+ " " + this.JiXiang; } }
代码已经给大家准备好了,是不是很贴心呢.
这是程序的运行结果
温馨小提示:.net中的stringbuilder 就是使用的建造者模式