简介
1、使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象,将⼀个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
2、允许⽤户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节
场景举例
1、KFC创建套餐:套餐是⼀个复杂对象,它⼀般包含主⻝如汉堡、烤翅等和饮料 如果汁、 可乐等组成部分,不同的套餐有不同的组合,⽽KFC的服务员可以根据顾客的要求,⼀步⼀步装配这些组成部分,构造⼀份完整的套餐
2、电脑有低配、⾼配,组装需要CPU、内存、电源、硬盘、主板等
图示
核心组成
Builder:抽象建造者,定义多个通⽤⽅法和构建⽅法
ConcreteBuilder:具体建造者,可以有多个
Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
Product:产品⻆⾊
demo
编码实践(同个设计模式 包括博⽂、书籍等不会完全相同,⼤体思想⼀致就⾏)
以建造电脑举例
创建Builder
/**
* 声明了建造者的公共方法
*/
public interface Builder {
/**
*细节方法 创建电脑的零件
*/
void buildCpu();
void buildMainboard();
void buildDisk();
void buildPower();
void buildMemory();
Computer createComputer();
}
创建ConcreteBuilder1
/**
* 具体的建造者,实现builder来创建低配电脑
*
**/
public class LowComputerBuilder implements Builder{
private Computer computer = new Computer();
@Override
public void buildCpu() {
computer.setCpu("低配 CPU");
}
@Override
public void buildMainboard() {
computer.setMainboard("低配 主板");
}
@Override
public void buildDisk() {
computer.setDisk("低配 磁盘");
}
@Override
public void buildPower() {
computer.setPower("低配 电源");
}
@Override
public void buildMemory() {
computer.setMemory("低配 内存");
}
@Override
public Computer createComputer() {
return computer;
}
}
创建ConcreteBuilder2
/**
* 具体的建造者,实现builder来创建高配电脑
*
**/
public class HighComputerBuilder implements Builder{
private Computer computer = new Computer();
@Override
public void buildCpu() {
computer.setCpu("高配 CPU");
}
@Override
public void buildMainboard() {
computer.setMainboard("高配 主板");
}
@Override
public void buildDisk() {
computer.setDisk("高配 磁盘");
}
@Override
public void buildPower() {
computer.setPower("高配 电源");
}
@Override
public void buildMemory() {
computer.setMemory("高配 内存");
}
@Override
public Computer createComputer() {
return computer;
}
}
创建Director
/**
* 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程
* Director是全程指导组装过程,具体的细节还是builder去操作
**/
public class Director {
public Computer craete(Builder builder){
builder.buildMemory();
builder.buildCpu();
builder.buildMainboard();
builder.buildDisk();
builder.buildPower();
return builder.createComputer();
}
}
测试demo
public class Main {
public static void main(String[] args) {
Director director = new Director();
Computer lowComputer = director.craete(new LowComputerBuilder());
Computer highComputer = director.craete(new HighComputerBuilder());
System.out.println(lowComputer.toString());
System.out.println(highComputer.toString());
}
}
结果展示
Computer{
cpu='低配 CPU',memory='低配 内存',mainboard='低配 主板',disk='低配 磁盘',power='低配 电源'}
Computertcpu={
'高配 CPU',memory='高配 内存',mainboard='高配 主板'disk='高配 磁盘',power='高配 电源'}
优缺点
优点
1、客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
2、每⼀个具体建造者都相对独⽴,⽽与其他的具体建造者⽆关,更加精细地控制产品的创建过程
3、增加新的具体建造者⽆须修改原有类库的代码,符合开闭原则
4、建造者模式结合链式编程来使⽤,代码上更加美观
缺点
建造者模式所创建的产品⼀般具有较多的共同点,如果产品差异⼤则不建议使⽤
JDK⾥⾯的应⽤
tcp传输协议 protobuf ⽣成的api、java中的StringBuilder(不完全⼀样,思想⼀样)
建造者模式与抽象⼯⼚模式的⽐较
建造者模式返回⼀个组装好的完整产品 , 抽象⼯⼚模式返回⼀系列相关的产品,这些产品位于不同的产品等级结构,构成了⼀个产品族