建造者模式
一、介绍
建造者模式(Builder Pattern)旨在将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。该模式通过一个指导者(Director)和多个建造者(Builder)来完成对象的构建。建造者模式适用于创建一些复杂的对象,这些对象由多个部分组成,而且构建过程稳定,但表示可以灵活变化的情况。
二、使用场景
- 当一个对象的构建过程比较复杂,有多个部分需要逐步构建时。
- 当需要构建的对象可以有不同的表示时,建造者模式可以灵活地构建不同的表示。
- 当构建过程稳定,但表示可以变化时,通过不同的建造者类可以构建不同的对象
三、核心组成
- 产品类(Product): 表示被构建的复杂对象。通常包含多个部分,具有复杂的结构。
- 抽象建造者接口(Builder): 声明了创建产品各个部分的抽象方法。
- 具体建造者类(ConcreteBuilder): 实现了抽象建造者接口,负责构建产品的具体部分。通常有一个与产品相关的内部表示。
- 指导者类(Director): 负责使用建造者接口构建产品。通常包含一个构建方法,该方法按照一定顺序调用建造者的方法,以完成产品的构建。
四、优缺点
优点
- 灵活性: 可以通过不同的具体建造者类构建不同的对象表示,实现了构建过程与表示的分离。
- 逐步构建: 可以按照一定的顺序逐步构建一个复杂对象,灵活控制构建过程。
- 更好的复用性: 可以复用相同的构建过程,通过不同的指导者和建造者组合来构建不同的对象。
缺点
- 增加了类和接口: 引入了多个新的类和接口,增加了系统的复杂性。
- 对象内部表示可能被暴露: 如果产品类的内部表示对客户端是可见的,可能破坏封
客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程
增加新的具体建造者无须修改原有类库的代码,符合开闭原则
建造者模式结合链式编程来使用,代码上更加美观
建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用
五、代码
Computer产品对象
package com.lcy.study.design.builder;
import lombok.Data;
/**
* @Description 建造者模式
* @Author lcy
* @Date 2021/7/20 21:49
*/
@Data
public class Computer {
/**
* cpu
*/
private String cpu;
/**
* 内存
*/
private String memory;
/**
* 主板
*/
private String mainBoard;
/**
* 硬盘
*/
private String disk;
/**
* 电源
*/
private String power;
}
抽象建造者ComputerBuilder
package com.lcy.study.design.builder;
/**
* @Description 建造者的公共方法
* @Author lcy
* @Date 2021/7/20 21:53
*/
public interface ComputerBuilder {
/**
* 构建Cpu
* @author lcy
* @date 2021/7/20 21:54
**/
void builderCpu();
/**
* 构建内存
* @author lcy
* @date 2021/7/20 21:54
**/
void builderMemory();
/**
* 构建主板
* @author lcy
* @date 2021/7/20 21:54
**/
void builderMainBoard();
/**
* 构建硬盘
* @author lcy
* @date 2021/7/20 21:54
**/
void builderDisk();
/**
* 构建电源
* @author lcy
* @date 2021/7/20 21:54
**/
void builderPower();
/**
* 组合电脑
* @return com.lcy.study.design.builder.Computer
* @author lcy
* @date 2021/7/20 21:55
**/
Computer createComputer();
}
具体建造者HighComputerBuilder
package com.lcy.study.design.builder;
/**
* @Description 高配电脑建造者
* @Author lcy
* @Date 2021/7/20 21:56
*/
public class HighComputerBuilder implements ComputerBuilder {
/**
* 电脑
*/
private Computer computer = new Computer();
@Override public void builderCpu(){
computer.setCpu("高配 cpu");
}
@Override public void builderMemory(){
computer.setMemory("高配 内存");
}
@Override public void builderMainBoard(){
computer.setMainBoard("高配 主板");
}
@Override public void builderDisk(){
computer.setDisk("高配 硬盘");
}
@Override public void builderPower(){
computer.setPower("高配 电源");
}
@Override public Computer createComputer(){
return computer;
}
}
组装者Diretor
package com.lcy.study.design.builder;
/**
* @Description 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程
* Director是全程指导组装过程,具体的细节还是builder去操作
* @Author lcy
* @Date 2021/7/20 22:00
*/
public class Diretor {
/**
* 组装电脑
* @param computerBuilder 电脑建造者
* @return com.lcy.study.design.builder.Computer
* @author lcy
* @date 2021/7/20 22:02
**/
public Computer createComputer(ComputerBuilder computerBuilder){
computerBuilder.builderCpu();
computerBuilder.builderMemory();
computerBuilder.builderMainBoard();
computerBuilder.builderDisk();
computerBuilder.builderPower();
return computerBuilder.createComputer();
}
}