建造模式/Builder
意图/适用场景:
如果一个产品由很多的配件组成,缺少了其中某一个配件,产品都不能工作。产品只有在所有配件都装配完成的情况下才能正常工作。对于这样的产品,不希望外界干预它的生产过程,在外界看来,生产者只提供完整的产品,而不提供任何的中间过程信息。这就是一个建造模式的应用场景。
建造模式的另一个方面在于,系统还提供不同的生产者,它们生产不两只的产品,但同样都不提供内部信息。
所以,在以下情况下可以使用Builder模式:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
UML:
参与者:
- 抽象建造者(Builder):
- 为创建一个Product对象的各个部件指定抽象接口。
- 具体建造者(ConcreteBuilder):
- 实现Builder的接口以构造和装配该产品的各个部件。
- 定义并明确它所创建的表示。
- 提供一个检索产品的接口。
- 向导(Director):
- 构造一个使用Builder接口的对象。
- 产品(Product):
- 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
- 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
应用实例:
参考《设计模式》书中本章“RTF(Rich Text Format)文档交换格式的阅读器”的例子。
示例代码:
[java]
// Source code from file:Builder.java
packagedesignPatterns.Builder;
publicinterface Builder {
publicvoid buildPart1();
publicvoid buildPart2();
}
// Source code from file:ConcreteBuilder.java
packagedesignPatterns.Builder;
publicclass ConcreteBuilder implements Builder {
publicvoid buildPart1() {
// do something
}
publicvoid buildPart2() {
// do something
}
publicProduct getProduct() {
Product p =new Product();
buildPart1();
buildPart2();
returnp;
}
}
// Source code from file:Director.java
packagedesignPatterns.Builder;
publicclass Director {
publicProduct buildProduct() {
ConcreteBuilder builder =new ConcreteBuilder();
returnbuilder.getProduct();
}
publicstatic void main(String[] args) {
Director director =new Director();
director.buildProduct();
}
}
// Source code from file:Product.java
packagedesignPatterns.Builder;
publicclass Product {
}
[/java]