建造者模式简介
建造者模式有四个角色,概念划分如下:
- Product : 产品类,最终要生成的对象(例如:一台电脑)。
- Builder :构建者的抽象基类或则抽象接口。定义了Product产品的生产流程的抽象步骤(比如一台电脑可以在出厂的时候就将所有外设配件搭载齐全,也可以只是原装的一台电脑,外设需要自己从别的地方购买)。
- ConcreteBuilder :Builder的实现类。
- Direcotr : 决定如何构建最终产品的算法逻辑,多个方法
Construct(Builder builder){//方法体}
(例如:你是要买一台外设齐全的电脑,还是一台没有任何外设的原装电脑),最后通过Builder.getProduct()
获得最终的产品。
类图如下(直接将韩老师的图拿过来了):
建造者模式–小例子(电脑购买)
购买一台电脑,可以买完整的包括所有外设的电脑,也可以买只有电脑本身无任何外设配件的电脑(且电脑品牌很多,联想华硕,可以自行选择电脑的cpu和主板,若买外设配件时,则根据购买电脑品牌来添加对应品牌外设)。
1.产品类
电脑CPU和主板都为必选,其余外设可不选。
package com.robin.builder;
// 一台完整的电脑产品
public class Computer {
private String cpu; // cpu 必选
private String mouse; // 鼠标 可选
private String monitor; // 屏幕显示器 可选
private String keyBoard; // 键盘 可选
private String mainBoard; // 主板 必选
// cpu和主板为必选,其余配件可以自行选择
public Computer(String cpu, String mainBoard) {
this.cpu = cpu;
this.mainBoard = mainBoard;
}
// 对可选的配件提供setter方法
public void setMouse(String mouse) {
this.mouse = mouse;
}
public void setMonitor(String monitor) {
this.monitor = monitor;
}
public void setKeyBoard(String keyBoard) {
this.keyBoard = keyBoard;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", mouse='" + mouse + '\'' +
", monitor='" + monitor + '\'' +
", keyBoard='" + keyBoard + '\'' +
", mainBoard='" + mainBoard + '\'' +
'}';
}
}
2.抽象构建者
抽象构建者:
package com.robin.builder;
// 抽象构建者
public abstract class ComputerBuilder {
public abstract Computer getComputer();
public abstract void setMouse();
public abstract void setMonitor();
public abstract void setKeyBoard();
}
3.实体构建类
两个不同品牌的电脑实体构建类:
联想:
package com.robin.builder;
// 品牌电脑实体构建者类
public class LenovoComputerBuilder extends ComputerBuilder{
private Computer computer;
public LenovoComputerBuilder(String cpu, String mainBoard) {
computer = new Computer(cpu, mainBoard);
}
@Override
public Computer getComputer() {
return computer;
}
@Override
public void setMouse() {
computer.setMouse("[lenovo]鼠标");
}
@Override
public void setMonitor() {
computer.setMonitor("[lenovo]240Hz高刷显示器");
}
@Override
public void setKeyBoard() {
computer.setKeyBoard("[lenovo]机械键盘");
}
}
华硕:
package com.robin.builder;
public class ASUSComputerBuilder extends ComputerBuilder{
private Computer computer;
public ASUSComputerBuilder(String cpu,String mainBoard) {
computer = new Computer(cpu, mainBoard);
}
@Override
public Computer getComputer() {
return computer;
}
@Override
public void setMouse() {
computer.setMouse("[华硕]鼠标");
}
@Override
public void setMonitor() {
computer.setMonitor("[华硕]显示屏");
}
@Override
public void setKeyBoard() {
computer.setKeyBoard("[华硕]机械键盘");
}
}
4.指导者类
通过两个方法来确定,创建(购买)何种类型包含何种配件。
package com.robin.builder;
public class ComputerDirector {
// 包含所有完整配件的电脑
public void buyCompleteComputer(ComputerBuilder computerBuilder){
computerBuilder.setMouse();
computerBuilder.setKeyBoard();
computerBuilder.setMonitor();
}
// 无配件的电脑
public void buyNoAcesComputer(ComputerBuilder computerBuilder){
}
}
5.客户端测试类
package com.robin.builder;
public class Main {
public static void main(String[] args) {
// 1.创建指挥者
ComputerDirector computerDirector = new ComputerDirector();
// 2.创建实体构造者
LenovoComputerBuilder lenovoComputerBuilder = new LenovoComputerBuilder("i9", "QDI");
// 3.指挥者调用构造者去设定电脑配件
computerDirector.buyCompleteComputer(lenovoComputerBuilder);
// 4.获取电脑产品
Computer computer1 = lenovoComputerBuilder.getComputer();
// 5.输出
System.out.println(computer1);
// 购买一台华硕电脑,其cpu为i7,主板为华硕,其余配件不进行选择
ASUSComputerBuilder asusComputerBuilder = new ASUSComputerBuilder("i7", "华硕");
computerDirector.buyNoAcesComputer(asusComputerBuilder);
Computer computer2 = asusComputerBuilder.getComputer();
System.out.println(computer2);
}
}
小结
建造者模式是设计模式中创建型的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式实用范围:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同表示时
tip: 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。