定义
指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
类图
优点
- 封装性好,构建和表示分离。
- 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
缺点
- 会产生Builder对象,消耗内存
- 构建过程对外暴露
代码
产品角色:包含多个组成部件的复杂对象。
public class Computer {
/*CPU*/
private String CPU;
/*内存*/
private String memory;
/*硬盘*/
private String hardDisk;
/*键盘*/
private String keyboard;
/*鼠标*/
private String mouse;
public String getCPU() {
return CPU;
}
public void setCPU(String CPU) {
this.CPU = CPU;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String getHardDisk() {
return hardDisk;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
public String getKeyboard() {
return keyboard;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public String getMouse() {
return mouse;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
@Override
public String toString() {
return "Computer{" +
"CPU='" + CPU + ''' +
", memory='" + memory + ''' +
", hardDisk='" + hardDisk + ''' +
", keyboard='" + keyboard + ''' +
", mouse='" + mouse + ''' +
'}';
}
}
抽象建造者:包含创建产品各个子部件的抽象方法。
public interface ComputerConfigBuilder {
void setCPU();
void setMemery();
void setHardDisk();
void setKeyboard();
void setMouse();
Computer getComputer();
}
具体建造者:实现了抽象建造者接口。
public class LowConfigBuilder implements ComputerConfigBuilder {
private Computer mComputer;
public LowConfigBuilder(){
this.mComputer = new Computer();
}
@Override
public void setCPU() {
mComputer.setCPU("i5");
}
@Override
public void setMemery() {
mComputer.setMemory("8G");
}
@Override
public void setHardDisk() {
mComputer.setHardDisk("500G");
}
@Override
public void setKeyboard() {
mComputer.setKeyboard("薄膜键盘");
}
@Override
public void setMouse() {
mComputer.setMouse("有线鼠标");
}
@Override
public Computer getComputer() {
return mComputer;
}
}
public class HighConfigBuider implements ComputerConfigBuilder {
private Computer mComputer;
public HighConfigBuider(){
this.mComputer = new Computer();
}
@Override
public void setCPU() {
mComputer.setCPU("i7");
}
@Override
public void setMemery() {
mComputer.setMemory("16G");
}
@Override
public void setHardDisk() {
mComputer.setHardDisk("1T");
}
@Override
public void setKeyboard() {
mComputer.setKeyboard("机械键盘");
}
@Override
public void setMouse() {
mComputer.setMouse("无线鼠标");
}
@Override
public Computer getComputer() {
return mComputer;
}
}
指挥者:调用建造者中的方法完成复杂对象的创建。
public class Director {
private ComputerConfigBuilder mBuilder;
public void setBuilder(ComputerConfigBuilder builder){
this.mBuilder = builder;
}
public void createComputer(){
mBuilder.setCPU();
mBuilder.setMemery();
mBuilder.setHardDisk();
mBuilder.setKeyboard();
mBuilder.setMouse();
}
public Computer getComputer(){
return mBuilder.getComputer();
}
}
演示:
低配版的
Director director = new Director();//创建装机人员
director.setBuilder(new LowConfigBuilder()); //告诉装机人员电脑配置,这里为低配版
director.createComputer(); //装机人员开始组装
Computer computer = director.getComputer(); //从装机人员获取组装好的电脑
System.out.print("电脑配置:" + computer.toString()); //查看电脑配置
--------------------------------------
输出结果:
电脑配置:Computer{CPU='i5', memory='8G', hardDisk='500G', keyboard='薄膜键盘', mouse='有线鼠标'}
--------------------------------------
高配版的
director.setBuilder(new HighConfigBuider());
director.createComputer();
Computer computer = director.getComputer();
System.out.print("电脑配置:" + computer.toString());
--------------------------------------
输出结果:
电脑配置:Computer{CPU='i7', memory='16G', hardDisk='1T', keyboard='机械键盘', mouse='无线鼠标'}
--------------------------------------
建造者模式和工厂模式的区别
工厂方法模式注重的是整体对象的创建方法
,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象
。