建造者(Builder)模式:表示一个对象通常由多个子部件按照一定的步骤组装起来的,例如:电脑是由CPU,显卡,内存,硬盘等部件组装的。
标准定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
优点:
- 封装好,构建与表示分离
- 扩展性好,建造者直接相互分离,系统解耦
- 建造过程细节化,不会对其他模块产生影响
缺点:
- 产品如果发生变化,则需要同步修改
建造者和工厂模式的区别:建造者模式更加关注组装过程,而工厂模式则更加关注创建过程
建造者模式的结构:
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息
示例:
public class BuilderDemo {
public static void main(String[] args) {
System.out.println(Builder.buildMac()); // Computer{cpu='cpu', monitor='Mac显示器', hardDisk='显卡', memory='内存'}
System.out.println(Builder.buildLenovo()); // Computer{cpu='cpu', monitor='联想显示器', hardDisk='显卡', memory='内存'}
}
// 具体产品
static class Computer{
private String cpu;
private String monitor;
private String hardDisk;
private String memory;
// 省略 get/set/toString方法
}
// 抽象构建者
interface AbstractBuilder{
Computer build(String cpu,String monitor,String hardDisk,String memory);
}
// 具体构建者
static class ComputerBuilder implements AbstractBuilder{
@Override
public Computer build(String cpu, String monitor, String hardDisk, String memory) {
return new Computer(cpu,monitor,hardDisk,memory);
}
}
// 指挥者
static class Builder{
static Computer buildMac(){
return new ComputerBuilder().build("cpu","Mac显示器","显卡","内存");
}
static Computer buildLenovo(){
return new ComputerBuilder().build("cpu","联想显示器","显卡","内存");
}
}
}