建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
产品的内部表象
一个产品常有不同的组成成分作为产品的零件。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址得到赋值之前,这个电子邮件不能发出。还有一些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况使得性质本身的建造涉及到复杂的商业逻辑。这时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程是建造零件的过程。由于建造零件的过程很复杂,因此,这些零件的建造过程往往被“外部化”到另外一个称做建造者的对象里,建造者对象返还给客户端的是一个全部零件都建造完毕的产品对象。
建造模式非常适合于此种情况。建造模式将产品结构和产品的零件建造过程对客户端隐藏起来,达到责任划分和封装的目的。
下面给出一个示意性的系统实现。该系统涉及到四个角色:
- 抽象建造者(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 { }
这里仅仅给出的是一个示意性的系统实现,建造者模式的具体应用请参考另一篇文章
时间: 2024-11-08 20:15:23