建造(Builder)模式属于对象的创建模式。
1. 定义
建造模式将一个产品的内部表象与产品生成过程分割出来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
2. 使用的原因
是为了将构建复杂对象的过程和它的部件解耦。
3. 适用的情况
建造模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的产品对象。建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造零件和责任分割开来,达到责任划分和封装的目的。
4. 各类的说明如下:
i)抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的构造;
ii)具体建造者(ConcretBuilder)角色:它在应用程序的调用下创建产品的实例。完成任务为;
a) 实现抽象建造者Builder接口,给出一步步完成创建产品实例的操作;
b) 在创建完成后,提供产品的实例。
iii) 导演者(Director角色):调用具体建造者角色以创建产品对象;
iv)产品(Product)角色:建造中的复杂对象。一般情况下,一个系统不止一个产品类。
5. 应用举例
以下实例建造一所Amigo想要的一所房子,呵呵,初中时的梦想:)
一所小小的竹子做成的房子,满屋挂满风铃,有一个茶几,坐落在山上。
1) 需求分析
Amigo的这所房子的建造跟我们讨论的建造模式很是相关哦,竹子、风铃、茶几相当于我们所说的“零件” ,最后建造成的房子相当于Amigo梦寐以求的竹房。呵呵,我们开始建造吧,完成Amigo的梦想!
i)我们首先建立一个接口Builder,它定义如何创建我想要的房子的各个组成部分:
public interface Builder {
//创建想要的竹子
void buildBamboo();
//创建风铃
void buildWindbell();
//创建茶几
void buildTeapoy();
//返回最后建造好的房子
//房子的组装过程不在这里进行,而是转移到Director中进行,从而实现了解耦过程和部件
House getHouse();
}
ii)Director类将竹子、风铃、茶几最后组装成我的full house
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
/** *//**
* 该方法组装我的full house
*/
public void construct() {
builder.buildBamboo();
builder.buildWindbell();
builder.buildTeapoy();
}
}
iii)具体建造器,茶几等怎么建造成的?我这样的懒人是不会知道的了,到时候请人吧。
public class ConcreteBuilder implements Builder {
public void buildBamboo() {
//让别人去做吧,我去数工钱了
}
public void buildWindbell() {
//同上
}
public void buildTeapoy() {
//同上
}
public House getHouse() {
}
}
iv)House类
public class House {
}
v) 下面来看看如何使用Builder模式来创建我的竹房,呵呵。
ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
House house = builder.getHouse();
:),建得差不多吧,还差点什么呢,以后慢慢想咯。