一、基本介绍
建造者模式(创建型):指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
二、包含角色
1.指挥者:它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,即构建搭建步骤。
2.产品角色:包含多个组成部件的复杂对象,由具体建造者来创建其各个部件,即最终构建出来的复杂对象。
3.抽象建造者:它是一个包含创建产品各个子部件的抽象方法的接口,也包含某些通用部件的构建方法。
4.具体建造者:实现抽象建造者接口,完成复杂产品的各个部件的具体创建方法。
三、案例及UML类图
案例说明:
目前需要创建一台电脑,按照步骤从里到外构建每一个组件,最后把它生产出来即可,当然每个厂商的电脑都是大同小异,建造步骤是相同,但具体细节不一定相同。
方式一:有指挥者
UML类图:
类AbstractComputerBulider:
public abstract class AbstractComputerBulider {
protected Computer computer = new Computer();
public abstract void createCpu();
public abstract void createBrand();
public abstract void createSize();
public abstract void createSystem();
/**
* 因为电压都相同,所以直接在父类设置
*/
public void createPower() {
computer.setPower(220);
}
public abstract void createShell();
public Computer buliderComputer() {
//只返回对象,具体构建过程由指挥者把控,职责划分。
return computer;
}
}
说明:抽象电脑建造者,抽象建造者,定义了构建产品的步骤以及通用方法。
类Computer:
public class Computer {
//品牌
private String brand;
//尺寸大小
private String size;
//电源
private Integer power;
//cpu
private String cpu;
//外壳
private String shell;
//系统
private String system;
public String getSystem() {
return system;
}
public void setSystem(String system) {
this.system = system;
}
public String getShell() {
return shell;
}
public void setShell(String shell) {
this.shell = shell;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public Integer getPower() {
return power;
}
public void setPower(Integer power) {
this.power = power;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
}
说明:电脑类,产品角色,最终创建出来的产品。
类Director:
public class Director {
private AbstractComputerBulider bulider;
public Director(AbstractComputerBulider bulider) {
this.bulider = bulider;
}
public Computer bulider() {
bulider.createBrand();
bulider.createPower();
bulider.createSize();
bulider.createCpu();
bulider.createSystem();
//最后才构建外壳
bulider.createShell();
return bulider.buliderComputer();
}
}
说明:指挥者,用于构建建造产品的步骤。
类DaiErComputerBuilider:
public class DaiErComputerBuilider extends AbstractComputerBulider {
@Override
public void createCpu() {
computer.setCpu("i5");
}
@Override
public void createBrand() {
computer.setBrand("戴尔");
}
@Override
public void createSize() {
computer.setSize("15.6");
}
@Override
public void createSystem() {
computer.setSystem("win10");
}
@Override
public void createShell() {
computer.setShell("金属拉丝");
}
}
说明:戴尔电脑建造者,具体建造者,实现抽象建造者中的抽象构建方法。
类HuaWeiComputerBulider:
public class HuaWeiComputerBulider extends AbstractComputerBulider {
@Override
public void createCpu() {
computer.setCpu("i5");
}
@Override
public void createBrand() {
computer.setBrand("华为");
}
@Override
public void createSize() {
computer.setSize("14");
}
@Override
public void createSystem() {
computer.setSystem("Deepin linux");
}
@Override
public void createShell() {
computer.setShell("塑料外壳");
}
}
说明:华为电脑建造者,具体建造者,实现抽象建造者中的抽象构建方法。
类BuliderTest1:
public class BuliderTest1 {
public static void main(String[] args) {
//构建华为电脑
Director huaWeiDirector = new Director(new HuaWeiComputerBulider());
Computer huaWeiComputer = huaWeiDirector.bulider();
System.out.println(huaWeiComputer.getBrand());
//构建戴尔电脑
Director daiErDirector = new Director(new DaiErComputerBuilider());
Computer daiErComputer = daiErDirector.bulider();
System.out.println(daiErComputer.getBrand());
}
}
说明:测试及客户端。
方式二:无指挥者
UML类图:
类AbstractComputerBulider:
public abstract class AbstractComputerBulider {
protected Computer computer = new Computer();
public abstract void createCpu();
public abstract void createBrand();
public abstract void createSize();
public abstract void createSystem();
/**
* 因为电压都相同,所以直接在父类设置
*/
public void createPower() {
computer.setPower(220);
}
public abstract void createShell();
public Computer buliderComputer() {
//构建步骤,充当指挥者的角色,违背了单一职责原则
createBrand();
createPower();
createSize();
createCpu();
createSystem();
//最后才构建外壳
createShell();
return computer;
}
}
说明:抽象电脑建造者,抽象建造者,定义了构建产品的步骤以及通用方法,并且兼职了指挥者角色,在建造时定义了构建步骤。
类Computer:
public class Computer {
//品牌
private String brand;
//尺寸大小
private String size;
//电源
private Integer power;
//cpu
private String cpu;
//外壳
private String shell;
//系统
private String system;
public String getSystem() {
return system;
}
public void setSystem(String system) {
this.system = system;
}
public String getShell() {
return shell;
}
public void setShell(String shell) {
this.shell = shell;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public Integer getPower() {
return power;
}
public void setPower(Integer power) {
this.power = power;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
}
说明:电脑类,产品角色,最终创建出来的产品。
类DaiErComputerBuilider:
public class DaiErComputerBuilider extends AbstractComputerBulider {
@Override
public void createCpu() {
computer.setCpu("i5");
}
@Override
public void createBrand() {
computer.setBrand("戴尔");
}
@Override
public void createSize() {
computer.setSize("15.6");
}
@Override
public void createSystem() {
computer.setSystem("win10");
}
@Override
public void createShell() {
computer.setShell("金属拉丝");
}
}
说明:戴尔电脑建造者,具体建造者,实现抽象建造者中的抽象构建方法。
类HuaWeiComputerBulider:
public class HuaWeiComputerBulider extends AbstractComputerBulider {
@Override
public void createCpu() {
computer.setCpu("i5");
}
@Override
public void createBrand() {
computer.setBrand("华为");
}
@Override
public void createSize() {
computer.setSize("14");
}
@Override
public void createSystem() {
computer.setSystem("Deepin linux");
}
@Override
public void createShell() {
computer.setShell("塑料外壳");
}
}
说明:华为电脑建造者,具体建造者,实现抽象建造者中的抽象构建方法。
类BuliderTest2:
public class BuliderTest2 {
public static void main(String[] args) {
//构建华为电脑
AbstractComputerBulider huaWeiBulider= new HuaWeiComputerBulider();
Computer huaWeiComputer = huaWeiBulider.buliderComputer();
System.out.println(huaWeiComputer.getBrand());
//构建戴尔电脑
AbstractComputerBulider daiErBulider = new DaiErComputerBuilider();
Computer daiErComputer = daiErBulider.buliderComputer();
System.out.println(daiErComputer.getBrand());
}
}
说明:测试及客户端类。
四、适用场景
1.适用于创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,构件间的建造顺序是稳定的,最终产品的差异化较小。
五、两种方式对比
方式一优缺点:
优:包含4个角色每个觉得职责划分很合理,没有违背单一职责原则。
缺:划分得太细需要创建的类过于多,使用过程变复杂。
方式二优缺点:
优:少创建类,使用过程变简单。
缺:违背单一职责原则
注意:一般使用方式二比较多,即使违背单一职责,但没有把代码复杂化,当然也可以使用方式一。