建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实用范围
1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2 当构造过程必须允许被构造的对象有不同表示时。
角色
在这样的设计模式中,有以下几个角色:
1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
如:客户端有个需求是组装电脑Computer,客户的最终要求是交付一台组装好的电脑,他/她不关心具体的组装过程和需要的组件,然而电脑的组装需要依赖很多组件,比如CPU ,主板,显卡,内存、、、等等一些列组件;同时也需要一个组装流程,先做什么,再装什么,于是乎用到了建造者模式去实现;
这里我们就只用CPU和主板Board来进行创建电脑的实现,以创建者模式来实现电脑的组装;
关系实现如下:
具体代码例子如下:
1、定义builder抽象接口
//抽象建造者(Builder)角色:
public interface Builder {
//创建CPU组件
public void createCpu();
//创建主板组件
public void createBoard();
//.....
//组装电脑
public Computer buildComputer();
}
//具体建造者(ComputerBuilder)角色
public class ComputerBuilder implements Builder {
private Computer computer;
public ComputerBuilder() {
computer = new Computer();
}
@Override
public void createCpu() {
// TODO Auto-generated method stub
Cpu cpu = new Cpu(1,"intel 6700");
computer.setCpu(cpu);
}
@Override
public void createBoard() {
Board board = new Board(1,"联想");
computer.setBoard(board);
}
@Override
public Computer buildComputer() {
return computer;
}
}
3、定义导演Directer角色管理创建
//导演者(Director)角色
public class ComputerDirector {
public Computer createComputer(Builder bud) {
bud.createCpu();
bud.createBoard();
return bud.buildComputer();
}
}
4、相关业务实体类
public class Computer {
// CPU
private Cpu cpu;
// 主板
private Board board;
public Cpu getCpu() {
return cpu;
}
public void setCpu(Cpu cpu) {
this.cpu = cpu;
}
public Board getBoard() {
return board;
}
public void setBoard(Board board) {
this.board = board;
}
}
public class Cpu {
private int id;
private String name;
public Cpu(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Board {
private int id;
private String name;
public Board(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5、客户端Client测试实现
public class Client {
private static void build() {
ComputerDirector cd = new ComputerDirector();
Computer computer = cd.createComputer(new ComputerBuilder());
System.out.println(computer.getCpu().getName());
System.out.println(computer.getBoard().getName());
}
public static void main(String[] args) {
build();
}
}
运行测试代码,输出
intel 6700
联想
引用说明:
客户端负责创建导演者和具体建造者对象。然后,客户端把具体建造者对象交给导演者,导演者操作具体建造者,开始创建产品。当产品完成后,建造者把产品返还给客户端。
导演者角色是与客户端打交道的角色。导演者将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。
一般来说,每有一个产品类,就有一个相应的具体建造者类。这些产品应当有一样数目的零件,而每有一个零件就相应地在所有的建造者角色里有一个建造方法。
把创建具体建造者对象的任务交给客户端而不是导演者对象,是为了将导演者对象与具体建造者对象的耦合变成动态的,从而使导演者对象可以操纵数个具体建造者对象中的任何一个。