1 定义
GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建
过程可以创建不同的表示。这句话说得很抽象,不好理解,其实它的意思可以理解为:将构
造复杂对象的过程和组成对象的部件解耦。
就像组装的电脑一样,不管什么品牌的配件,只要兼
容就可以装上;同样,一样的配件,可以有好多组装的方式。这是对降低耦合、提高可复用
性精神的一种贯彻。
2 结构
当要生成的产品有复杂的内部结构——比如由多个对象组成;而系统中对此产品的需求 将来可能要改变产品对象的内部结构的构成,比如说产品的一些属性现在由一个小对象组 成,而更改后的型号可能需要 N 个小对象组成;而且不能将产品的内部构造完全暴露给客 户程序,一是为了可用性,二是为了安全等因素。满足上面的设计环境就可以考虑使用建造 模式来搭建框架了。
建造模式的组成:
- 抽象构造者模式--这个角色用来规范产品对象的各个组成成分的建造。一般而言,此角色独立于应用程序的业务逻辑。
- 具体建造者角色--担任这个角色的是于应用程序紧密相关的类,它们在指导者的调用下 创建产品实例。这个角色在实现抽象建造者角色提供的方法的前提下,达到完成产品组 装,提供成品的功能.
- 指导者角色--调用具体建造者角色以创建产品对象。指导者并没有产品类的具体知识.(也叫上下文) 真正拥有产品类的具体知识的是具体建造者对象。
- 产品角色--建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产 品的接口。

3 代码示例
这里以一个简单的iphone6的生产为例
iphone实体类
public class Iphone6 {
private Cell cell; //电池
private Screen screen; //屏幕
private Mainboard mainboard; //主板
public void open() {
System.out.println("手机开机");
}
public Cell getCell() {
return cell;
}
public void setCell(Cell cell) {
this.cell = cell;
}
public Screen getScreen() {
return screen;
}
public void setScreen(Screen screen) {
this.screen = screen;
}
public Mainboard getMainboard() {
return mainboard;
}
public void setMainboard(Mainboard mainboard) {
this.mainboard = mainboard;
}
}
//电池类
class Cell{
private String name;
public Cell(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//电池类
class Screen{
private String name;
public Screen(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//主板类
class Mainboard{
private String name;
public Mainboard(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
指导者接口
//指导者
public interface Iphone6Director {
Iphone6 dircectIphone6();
}
构造者接口
//构造者抽象类
public interface Iphone6Builder {
//构建自组建
Cell builderCell();
Screen builderScreen();
Mainboard builderMainboard();
}
构造者实现类--用来创建复杂对象各个组件
public class MyIphone6Builder implements Iphone6Builder{
@Override
public Cell builderCell() {
// TODO Auto-generated method stub
System.out.println("构建屏幕");
//也可以与工厂模式或单例模式相结合
return new Cell("iphone6的屏幕");
}
@Override
public Screen builderScreen() {
// TODO Auto-generated method stub
System.out.println("构建电池");
return new Screen("iphone6的电池");
}
@Override
public Mainboard builderMainboard() {
// TODO Auto-generated method stub
System.out.println("构建主板");
return new Mainboard("iphone6的主板");
}
}
指导者实现类--负责安排各个组件的建造顺序
public class MyIphone6Director implements Iphone6Director{
private MyIphone6Builder builder;
public MyIphone6Director(MyIphone6Builder builder) {
this.builder = builder;
}
@Override
public Iphone6 dircectIphone6() {
// TODO Auto-generated method stub
Cell cell = builder.builderCell();
Mainboard mainboard = builder.builderMainboard();
Screen screen = builder.builderScreen();
//装配成iphone6
Iphone6 iphone6 = new Iphone6();
iphone6.setCell(cell);
iphone6.setMainboard(mainboard);
iphone6.setScreen(screen);
return iphone6;
}
}
测试类
public class TestIphone {
public static void main(String[] args) {
MyIphone6Director director = new MyIphone6Director(new MyIphone6Builder());
Iphone6 iphone6 = director.dircectIphone6();
iphone6.open();
}
}
最终一台iphone手机就被组将建造出来了:
构建屏幕
构建主板
构建电池
手机开机
4 构造者模式的优点:
- 建造模式使得客户不需要知道太多产品内部的细节。它将复杂对象的组建和表示方式封 装在一个具体的建造角色中,而且由指导者来协调建造者角色来得到具体的产品实例。
- 建造模式可以对复杂产品的创建进行更加精细的控制。产品的组成是由指导者角色调用 具体建造者角色来逐步完成的,所以比起其它创建型模式能更好的反映产品的构造过程。
5 扩展:
建造模式中很可能要用到组成成品的各种组件类,对于这些类的创建可以考虑使用工厂
方法或者原型模式来实现,在必要的时候也可以加上单例模式来控制类实例的产生。但是要
坚持一个大前提就是要使引入的模式给你的系统带来好处,而不是臃肿的结构。
建造模式在得到复杂产品的时候可能要引用多个不同的组件,在这一点上来看,建造模
式和抽象工厂模式是相似的。可以从以下两点来区分两者:创建模式着重于逐步将组件装配
成一个成品并向外提供成品,而抽象工厂模式着重于得到产品族中相关的多个产品对象;抽
象工厂模式的应用是受限于产品族的,建造模式则不会。
还可参考:
Java设计模式之构造者模式,你真正了解过吗