简介
实现方式
-
一般会有以下几个角色
客户(Client):调用指挥者来获取复杂对象
产品(Product):描述一个由一系列部件组成的复杂对象
抽象建造者(Builder):用于稳定具体建造者的公共接口,一般定义建造细节的方法
具体建造者(ConcreteBuilder):实现抽象建造者接口,并描述具体建造细节
指挥者(Director):调用具体建造者来创建复杂对象的各个组成部分,并按一定顺序建造复杂对象
-
具体例子
用 电脑城卖电脑 的例子来讲解
电脑为具体产品,硬件配置为产品属性。
现在客户去到电脑城买电脑,但是不知道具体的硬件配置,电脑城就将电脑按用途分类为低档、中档、高档、超高档,
并写了一套规范用于稳定装机人员的装机过程,客户只需要告诉服务员需要什么用途的电脑,服务员就根据客户提供的信息指挥装机人员进行装机,并将装好的电脑给到客户。
在这里,有几个重点对象:
- 客户=Client
- 电脑=Product
- 装机规范=Builder
- 装机人员=Concrete
- 服务员=Director
代码实现
1. 具体的产品
public class Computer {
private String cpu;//处理器
private String memory;//内存
private String vc;//显卡
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 getVc() {
return vc;
}
public void setVc(String vc) {
this.vc = vc;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", memory='" + memory + '\'' +
", vc='" + vc + '\'' +
'}';
}
}
2. 定义建造者接口,规范建造者实现类
public interface ComputerBuilder {
void setCpu();
void setMemory();
void setVc();
Computer build();
}
3. 定义具体建造者,实现建造者接口,并实现具体方法
public class ComputerBuilder01 implements ComputerBuilder {
private Computer computer = new Computer();
public Computer build(){
return computer;
}
@Override
public void setCpu() {
computer.setCpu("i5 7代");
}
@Override
public void setMemory() {
computer.setMemory("512G");
}
@Override
public void setVc() {
computer.setVc("GTX1050");
}
}
public class ComputerBuilder02 implements ComputerBuilder {
private Computer computer = new Computer();
public Computer build(){
return computer;
}
@Override
public void setCpu() {
computer.setCpu("i7 7代");
}
@Override
public void setMemory() {
computer.setMemory("1T");
}
@Override
public void setVc() {
computer.setVc("GTX1060");
}
}
public class ComputerBuilder03 implements ComputerBuilder {
private Computer computer = new Computer();
public Computer build(){
return computer;
}
@Override
public void setCpu() {
computer.setCpu("i9 7代");
}
@Override
public void setMemory() {
computer.setMemory("2T");
}
@Override
public void setVc() {
computer.setVc("RTX2080");
}
4. 定义指挥者,使用具体建造者来创建对象
public class Director {
public Computer build(ComputerBuilder computerBuilder){
computerBuilder.setCpu();
computerBuilder.setMemory();
computerBuilder.setVc();
return computerBuilder.build();
}
}
5. 客户
@Test
public void test04(){
Director director = new Director();
ComputerBuilder01 b1 = new ComputerBuilder01();
Computer computer1 = director.build(b1);
System.out.println(computer1);
ComputerBuilder02 b2 = new ComputerBuilder02();
Computer computer2 = director.build(b2);
System.out.println(computer2);
ComputerBuilder03 b3 = new ComputerBuilder03();
Computer computer3 = director.build(b3);
System.out.println(computer3);
}
参考文档
https://www.runoob.com/design-pattern/builder-pattern.html
完成