建造者模式是日常开发中比较常见的设计模式,它的主要作用就是讲复杂事务创建的过程抽象出来,该抽象的不同实现方式,创建出的对象也不同。
通俗地讲,创建一个对象一般都会有一个固定的步骤,这个固定的步骤我们把它抽象出来。
建造者模式分为两种:
- 经典建造者模式
- 变种建造者模式
经典建造者模式
UML类图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pIuNyKwS-1591857099537)(file:///Users/yangmingyue/Documents/Gridea/post-images/1590993459408.jpg)]
四个角色:
- Product – 产品
- Builder – 抽象的步骤
- ConcreteBuilder – Builder具体的实现
- Director – 使用者
代码:
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 + '\'' +
'}';
}
}
Builder 类:
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;
}
}
Director:
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();
}
}
Test:
Director director = new Director();//创建装机人员
director.setBuilder(new LowConfigBuilder()); //告诉装机人员电脑配置,这里为低配版
director.createComputer(); //装机人员开始组装
Computer computer = director.getComputer(); //从装机人员获取组装好的电脑
System.out.print("电脑配置:" + computer.toString()); //查看电脑配置
director.setBuilder(new HighConfigBuider());
director.createComputer();
Computer computer = director.getComputer();
System.out.print("电脑配置:" + computer.toString());
变种Builder模式
代码:
public class Person {
/*名字(必须)*/
private final String name;
/*性别(必须)*/
private final String gender;
/*年龄(非必须)*/
private final String age;
/*鞋子(非必须)*/
private final String shoes;
/*衣服(非必须)*/
private final String clothes;
/*钱(非必须)*/
private final String money;
/*房子(非必须)*/
private final String house;
/*汽车(非必须)*/
private final String car;
/*职业(非必须)*/
private final String career;
private Person(Builder builder) {
this.name = builder.name;
this.gender = builder.gender;
this.age = builder.age;
this.shoes = builder.shoes;
this.clothes = builder.clothes;
this.money = builder.money;
this.house = builder.house;
this.car = builder.car;
this.career = builder.career;
}
public static class Builder {
private final String name;
private final String gender;
private String age;
private String shoes;
private String clothes;
private String money;
private String house;
private String car;
private String career;
public Builder(String name,String gender) {
this.name = name;
this.gender = gender;
}
public Builder age(String age) {
this.age = age;
return this;
}
public Builder car(String car) {
this.car = car;
return this;
}
public Builder shoes(String shoes) {
this.shoes = shoes;
return this;
}
public Builder clothes(String clothes) {
this.clothes = clothes;
return this;
}
public Builder money(String money) {
this.money = money;
return this;
}
public Builder house(String house) {
this.house = house;
return this;
}
public Builder career(String career) {
this.career = career;
return this;
}
public Person build(){
return new Person(this);
}
}
Test:
Person person = new Person.Builder("张三","男")
.age("12")
.money("1000000")
.car("宝马")
.build();