建造(Builder)模式又称生成模式。它将一个复杂对象的构建过程和对象的表示过程分离开来。
建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
什么是内部表象?
《设计与模式》中是这样描述的:
“一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,他们通常又叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品有哪些零件,每个产品的对应零件彼此有何不同,是怎么建造出来的,以及怎样组成产品。”
再谈工厂模式
工厂模式也是对象的创建模式,通常我们利用工厂模式是直接创建一系列对象,但是工厂模式创建对象是:既包含创建过程,又包含了创建对象功能。比如创造人,工厂模式即创建了人(产品),也创建了人的组成部分(零件):手、脚和头。
而建造模式却解决了这一个问题,它将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。
类图及代码实现
各个部件及其作用
image指挥者
- 作用:构建Builder对象接口的对象。指挥者调度具体的构建细节。
- 用于创建一些复杂对象(有建造细节,即有很多零件组成的产品)。
- 适用于对象内部构建过程和顺序比较稳定的过程。
建造者
- 作用:创建一个产品对象的各个部件的抽象接口。
具体建造者
- 实现Builder接口,描写各个部件的具体细节。
Product: 具体产品
类图
image/*
* 产品
*/
public class Product {
private String parts;
// 添加产品
public void addParts(String s) {
this.parts = s;
System.out.println("建造:"+s);
}
public String toString() {
return this.parts;
}
}
/*
* 建造者类接口
*/
public abstract class Builder {
//封装了一个产品类的引用
protected Product pr;
// 构造方法,在创建建造者类对象的同时,也创建了产品类对象。
public Builder(){
pr = new Product();
}
// 返回产品对象
public Product getProduct() {
return pr;
}
// 创建各个部分零件的方法
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
}
/*
* 具体建造者
*/
public class ConcreteBuilderA extends Builder{
public ConcreteBuilderA() {
super();
System.out.println("建造产品中"+"... ...");
}
@Override
public void buildPartA() {
pr.addParts("partA");
}
@Override
public void buildPartB() {
pr.addParts("partB");
}
@Override
public void buildPartC() {
pr.addParts("partC");
}
}
/*
* 指挥者
*/
public class Director {
public void construct(Builder b) {
// 顺序调用,依次组建产品的各个部分
b.buildPartA();
b.buildPartB();
b.buildPartC();
System.out.println("建造完成!");
}
}
/*
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 创建一个指挥者对象
Director d = new Director();
// 创建一个具体构建者对象
ConcreteBuilderA cbA = new ConcreteBuilderA();
// 开始创建
d.construct(cbA);
// 获取已经创建的产品
Product product = cbA.getProduct();
}
}
网友评论