建造模式(Builder)
2015-08-10 17:27 你吃不吃麦芽糖 阅读(152) 评论(0) 收藏 举报建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
产品的内部表象
一个产品常有不同的组成成分作为产品的零件。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址得到赋值之前,这个电子邮件不能发出。还有一些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况使得性质本身的建造涉及到复杂的商业逻辑。这时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程是建造零件的过程。由于建造零件的过程很复杂,因此,这些零件的建造过程往往被“外部化”到另外一个称做建造者的对象里,建造者对象返还给客户端的是一个全部零件都建造完毕的产品对象。
建造模式非常适合于此种情况。建造模式将产品结构和产品的零件建造过程对客户端隐藏起来,达到责任划分和封装的目的。
下面给出一个示意性的系统实现。该系统涉及到四个角色:
- 抽象建造者(builder)角色:这是一个抽象的接口,以规范产品对象各个组成成分的建造。该接口一般包含两种方法,一种是建造方法:例如本例中的buildPart1(),buildPart2()。另一种是结果返还方法:即本例中的retrieveResult()方法。一般来说产品所包含的零件数目与建造方法的数目相等。换言之,有多少零件就有多少的建造方法。
- 具体建造者角色(ConcreteBuilder):抽象建造者角色的具体实现,这个类与应用程序紧密相关,它们在应用程序的调用下创建产品的实例。这个角色主要完成的任务有:
- 实现抽象建造者角色所声明的接口,给出一步一步完成产品创建的操作
- 在建造过程完成后,提供产品的实例
- 导演者角色(Director):担任这个角色的类调用具体建造者角色来完成产品对象的创建。
- 产品角色(Product):产品便是建造中的复杂对象。一般一个系统中会有多于一个的产品类,而且这些产品类不一定有共同的接口,而完全可以是不相关的。
导演者角色是与客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再把这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。
一下是系统源代码:
/*
* 导演者角色
* */
public class Director {
private Builder builder;
/*
* 产品的构建方法,负责调用各个零件的构建方法
* */
public void construct()
{
builder=new ConcreteBuilder();
builder.buildPart1();
builder.buildPart2();
builder.retrieveResult();
}
}
/*
* 抽象建造者角色
* */
public abstract class Builder {
/*
* 产品零件构建方法
* */
public abstract void buildPart1();
/*
* 产品零件构建方法
* */
public abstract void buildPart2();
/*
* 产品返还方法
* */
public abstract Product retrieveResult();
}
/*
* 具体建造者角色
* */
public class ConcreteBuilder extends Builder {
private Product product=new Product();
@Override
public void buildPart1() {
// TODO Auto-generated method stub
}
@Override
public void buildPart2() {
// TODO Auto-generated method stub
}
@Override
public Product retrieveResult() {
// TODO Auto-generated method stub
return product;
}
}
/*
* 产品角色
* */
public class Product {
}
这里仅仅给出的是一个示意性的系统实现,建造者模式的具体应用请参考另一篇文章
浙公网安备 33010602011771号