建造者模式:导向器封装生成产品的具体步骤
《设计模式》中定义:
Builder模式的缘起:
假设创建游戏中的一个房屋House设施,该房屋的构建由几部分组成,且各个部分富于变化。如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正.....
动机(Motivation):
在软件系统中,有时候面临一个"复杂对象"的创建工作,其通常由各个部分的子对象用一定算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合到一起的算法却相对稳定。
如何应对种变化呢?如何提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化,从而保持系统中的"稳定构建算法"不随需求的改变而改变?
意图(Intent):
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
UML 表示如下:
这里的Builder是一个抽象类,不是接口,为了共用一些属性和代码,把稍微变化的部分让子类来实现(显然Builder 和 ConcreteOneProduct、ConcreteTwoProduct组成了个模板模式)。
先看建造者,一个抽象类,提供一些公用实现(Builder.java):
一个实现,主要是绘制三角形:
第二个实现:
产品定义:
导向器,封装着产品生成的具体过程:
客户端代码调用方式:
输入如下:
每一次运行可能生成变形长度都会变好,这个变好有导向器进行控制着。
源文件下载
Builder模式的缘起:
假设创建游戏中的一个房屋House设施,该房屋的构建由几部分组成,且各个部分富于变化。如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正.....
动机(Motivation):
在软件系统中,有时候面临一个"复杂对象"的创建工作,其通常由各个部分的子对象用一定算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合到一起的算法却相对稳定。
如何应对种变化呢?如何提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化,从而保持系统中的"稳定构建算法"不随需求的改变而改变?
意图(Intent):
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
UML 表示如下:
Builder模式 |
这里的Builder是一个抽象类,不是接口,为了共用一些属性和代码,把稍微变化的部分让子类来实现(显然Builder 和 ConcreteOneProduct、ConcreteTwoProduct组成了个模板模式)。
先看建造者,一个抽象类,提供一些公用实现(Builder.java):
/** |
一个实现,主要是绘制三角形:
public class ConcreteOneBuilder extends Builder { |
第二个实现:
public class ConcreteTwoBuilder extends Builder { |
产品定义:
/** |
导向器,封装着产品生成的具体过程:
/** |
客户端代码调用方式:
public class Client { |
输入如下:
产品型号(0.23):
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
现在输出第二个产品:
产品型号(0.17):
* * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * *
* * * * * * * *
* * * * * * *
* * * * * *
* * * * *
* * * *
* * *
* *
*
每一次运行可能生成变形长度都会变好,这个变好有导向器进行控制着。
源文件下载