基本概念
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,又叫做生成器模式。建造者模式将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同内部表象的产品对象。
结构图
上图摘自《大话设计模式》
应用场景
如果一个对象的创建有固定的组成和流程,如组装电脑,包括主机、显示器、键盘、鼠标等几个主要部分(示例代码就是以此为例的),当需要将复杂对象的创建与它的表示分离时可以使用建造者模式。使用了建造着模式,只需要传入指定的建造类型就可以得到对应的产品,而具体的建造过程和细节则不需要知道。
源码示例(以组装电脑为例)
1.创建产品类,即Computer
package com.spook.builder;
/**
* 产品类,以计算机为例,建造者模式最终就是要创建出产品
*/
public class Computer {
/** 主机 */
private String host;
/** 显示器 */
private String monitor;
/** 鼠标 */
private String mouse;
/** 键盘 */
private String keyboard;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getMonitor() {
return monitor;
}
public void setMonitor(String monitor) {
this.monitor = monitor;
}
public String getMouse() {
return mouse;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
public String getKeyboard() {
return keyboard;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public void show() {
System.out.println("主机:" + getHost() + ",显示器:" + getMonitor() + ",鼠标:" + getMouse() + ",键盘:" + getKeyboard());
}
}
2.创建builder接口
package com.spook.builder;
/**
* 电脑建造者接口,假定电脑由以下四部分组成
*/
public interface ComputerBuilder {
/** 添加主机 */
public void addHost();
/** 添加显示器 */
public void addMonitor();
/** 添加鼠标 */
public void addMouse();
/** 添加键盘 */
public void addKeyBoard();
/** 组装,返回一个电脑对象 */
public Computer build();
}
3.创建builder接口的一个实现类,LenovoBuilder
package com.spook.builder;
public class LenovoBuilder implements ComputerBuilder {
private Computer lenoveComputer = new Computer();
@Override
public void addHost() {
// TODO Auto-generated method stub
lenoveComputer.setHost("联想主机");
}
@Override
public void addMonitor() {
// TODO Auto-generated method stub
lenoveComputer.setMonitor("联想显示器");
}
@Override
public void addMouse() {
// TODO Auto-generated method stub
lenoveComputer.setMouse("联想鼠标");
}
@Override
public void addKeyBoard() {
// TODO Auto-generated method stub
lenoveComputer.setKeyboard("联想键盘");
}
@Override
public Computer build() {
// TODO Auto-generated method stub
return lenoveComputer;
}
}
4.创建builder接口的另一个实现类,DellBuilder
package com.spook.builder;
public class DellBuilder implements ComputerBuilder {
private Computer dellComputer = new Computer();
@Override
public void addHost() {
// TODO Auto-generated method stub
dellComputer.setHost("戴尔主机");
}
@Override
public void addMonitor() {
// TODO Auto-generated method stub
dellComputer.setMonitor("戴尔显示器");
}
@Override
public void addMouse() {
// TODO Auto-generated method stub
dellComputer.setMouse("戴尔鼠标");
}
@Override
public void addKeyBoard() {
// TODO Auto-generated method stub
dellComputer.setKeyboard("戴尔键盘");
}
@Override
public Computer build() {
// TODO Auto-generated method stub
return dellComputer;
}
}
5.创建一个工人类,通过不同的Builder生产不同的电脑
package com.spook.builder;
/**
* 组装电脑的工人,可选用不同的建造者建造不同型号的电脑
*/
public class Worker {
/***
* 通过特定的建造者来组装电脑
*
* @param builder
*/
public void assembleByBuilder(ComputerBuilder builder) {
builder.addHost();
builder.addMonitor();
builder.addMouse();
builder.addKeyBoard();
}
}
6.测试类
package com.spook.builder;
/***
* 测试类
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Worker worker = new Worker();
/**
* 联想电脑建造者
*/
ComputerBuilder lenovoBuilder = new LenovoBuilder();
worker.assembleByBuilder(lenovoBuilder);
Computer lenovoComputer = lenovoBuilder.build();
lenovoComputer.show();
/**
* 戴尔电脑建造者
*/
ComputerBuilder dellBuilder = new DellBuilder();
worker.assembleByBuilder(dellBuilder);
Computer dellComputer = dellBuilder.build();
dellComputer.show();
}
}
运行测试类会输出如下内容:
主机:联想主机,显示器:联想显示器,鼠标:联想鼠标,键盘:联想键盘
主机:戴尔主机,显示器:戴尔显示器,鼠标:戴尔鼠标,键盘:戴尔键盘