JAVA设计模式-06-建造者模式
参考:http://blog.****.net/pengjunlee/article/details/51569959
部分经典内容引用:
点击打开链接:http://www.cnblogs.com/lwbqqyumidi/p/3742562.html
前言
听完本节课之后顿时头大了,感觉有点像工厂方法模式,查看了网上很多文章也是众说纷纭,看到了corn的这篇文章才有点拨开云雾见晴天的感觉。
一、什么是建造者模式
建造者(Builder)模式也叫生成器模式,是由GoF提出的23种设计模式中的一种,其设计意图是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
GoF给出的描述很简短,不易理解,我是这样理解的:我们要创建的对象会包含有各种各样的属性(可以是对象,也可以不是对象,就好比汽车的零配件),这些属性就叫做这个对象的表示,有了属性之后我们还需要将这些属性按照一定的规则或者顺序组装起来才能创造出对象来(这就好比用汽车零件组装汽车),而这个组装的过程就是对象的构建,Builder模式将对象的表示与对象的构建分别交由建造者和指挥者去负责,整个对象的创建过程对客户端是隐藏的,客户端只需要去调用建造者和指挥者去创建对象,而不必关系这个对象都有哪些属性,以及各个属性之间是怎么样进行组装的,达到了责任划分和封装的目的。
二、建造者模式的结构
建造者模式适合于创建比较复杂的对象,所谓复杂有两个方向:
- 创建过程复杂,创建的步骤有严格的顺序。
- 创建对象的结构复杂,创建对象包含的属性数量多。
针对以上两类的复杂对象Builder模式也分别演化出了两种表现形式。
第一种:
通过Product、ConcreteBuilder、Builder和Director形成的建造者模式。![]()
从上图可以看出,这种Builder模式包含4个角色:产品(Product),具体建造者(ConcreteBuilder),建造者(Builder),指挥者(Director)
产品:需要创建的对象产品
建造者:本质为抽象类,里面的抽象方法供具体建造者重写。
具体建造者:创建产品的实例并且实现建造者多个方法对产品进行装配。
指挥者:有条不紊的按顺序调用建造者抽象类及其方法。
我们都知道计算机重装系统是一件很复杂的事情,首先你要备份重要数据、格式化硬盘,安装操作系统,然后再拷贝数据,安装驱动,安装常用软件,等等...,接下来我们就以重装计算机操作系统为例来体会一下Builder模式的作用。
我们需要一个类来说明安装后的系统要包含哪些东西,这个类就是我们要创建的产品类。
再创建一个ISysInstallBuilder接口把重装系统过程中我们要做的事情都罗列出来,这个接口就扮演了Builder模式中的建造者角色。
接下来我们来实现安装Windows XP系统的具体建造者类WinXpInstallBuilder,以后需要安装Windows XP系统就用它。
现在我们有了一个具体建造者类WinXpInstallBuilder,接下来我们尝试着用它来重装一下系统。
运行程序打印结果如下:
细心的你可能发现了,我安装的这个系统是有问题的,我把系统安装步骤的顺序搞乱了,复制数据应该放在格式化硬盘并安装好操作系统之后,安装驱动应该放在安装操作系统之后。
由于安装系统的步骤比较复杂,虽然我已经很小心翼翼可还是把安装步骤给搞错了,怎样才能让系统按照正确的步骤安装而不会搞乱顺序呢?到了指挥者出场的时刻了。
接下来我们再使用指挥者装一次系统试试。
运行程序打印结果如下:
在有了指挥者的帮忙后,系统按照正确的顺序安装完成了。
接下来我们再实现一个安装Win7系统的具体建造者类Win7InstallBuilder。
在客户端中测试一下安装Win7系统。
运行程序打印结果如下:
Win7系统也被正确安装,Builder模式通过指挥者和建造者将要创建的对象属性和属性的装配过程进行分离,一样的创建过程由于传入的具体建造者不同最终创建出了完全不同的对象,而且无需再担忧把组装顺序搞混了。
第二种:
通过静态内部类实现复杂对象的无序构造。
创建一个个人信息类PersonalInfo,其中包含个人信息包括:电话号码,地址,姓名,年龄,性别,身份证号。
在客户端中使用此类创建个人信息测试一下。
运行程序打印结果如下:
此种方式通过级联方式去创建对象,可自由控制创建对象的属性个数,减少了重复代码,使对象的创建更加形象直观。
三、建造者模式应用场景
如果碰到以下情况,可以考虑使用建造者模式:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象