「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。
一、什么是建造者模式
构造者模式定义:指将一个复杂对象的构造与它的表示分离开来,使同样的构造过程可以创建不同的表示。实质上就是构造一个复杂的对象的过程中,灵活的选择构造出不同的对象。比如构建一个电脑的过程中,需要配置cpu,键盘,鼠标,屏幕,内存,显卡等,不同的搭配可以配置不同的电脑。比如可以使用海尔cpu,海尔显卡等组成海尔类型的电脑(好像没有海尔电脑),或者使用长虹cpu,键盘组成长虹电脑,或者有的电脑可以不配置显卡,但电脑的组装方式基本都是类似。但配件的选择多种多样,可以构造不同的电脑。
二、建造者模式的实现
@Data
public class Computer {
//电脑需要鼠标键盘 cpu,屏幕(其它的就不一一列举了)
private String mouse;
private String screen;
private String cpu;
private String keyboard;
}
产品,此处为电脑
public abstract class AbstractBuilder {
Computer computer = new Computer();
public abstract void buildMouse();
public abstract void buildScreen();
public abstract void buildCpu();
public abstract void buildKeyboard();
public Computer getComputer(){
return computer;
}
}
抽象构建者,包含产品各部分的构建方法和获取产品的方法。
public class HaierBuilder extends AbstractBuilder {
@Override
public void buildMouse() {
computer.setMouse("Haier Mouse");
}
@Override
public void buildScreen() {
computer.setScreen("Haier Screen");
}
@Override
public void buildCpu() {
computer.setCpu("Haier Cpu");
}
@Override
public void buildKeyboard() {
computer.setKeyboard("Haier Keyboard");
}
}
具体构建者,海尔建造者,实现了海尔各个部件的构成方法。
public class ChanghongBuilder extends AbstractBuilder{
@Override
public void buildMouse() {
computer.setMouse("Changhong Mouse");
}
@Override
public void buildScreen() {
computer.setScreen("Changhong Screen");
}
@Override
public void buildCpu() {
computer.setCpu("Changhong Cpu");
}
@Override
public void buildKeyboard() {
computer.setKeyboard("Changhong Keyboard");
}
}
长虹构造者。
public class Director {
private AbstractBuilder builder;
public Director(AbstractBuilder builder) {
this.builder = builder;
}
public Computer construct() {
builder.buildMouse();
builder.buildScreen();
builder.buildCpu();
builder.buildKeyboard();
return builder.getComputer();
}
}
指挥者:调用构造者的方法完成复杂对象的构建。指挥者就体现了构造过程的一致性,此处表示组装电脑的方式基本使类似的。
public static void main(String[] args) {
AbstractBuilder builderA = new HaierBuilder();
Director directorA = new Director(builderA);
Computer computerA = directorA.construct();
System.out.println(computerA);
AbstractBuilder builderB = new ChanghongBuilder();
Director director = new Director(builderB);
Computer computerB = director.construct();
System.out.println(computerB);
}
同样的构建方式,但由于构建者的不同构造出了不同的对象。
三、总结
优点:封装性好,构造与表现分离。扩展性好,各个具体的构造者相互独立。
缺点:产品内部组成比较复杂,如果产品内部出现修改,那么所有构造者都要修改。
使用场景:比如游戏角色的构建,或者电子邮件的构建。
建造者模式与工厂模式的区别:建造者模式主要体现在复杂产品的构造上。旨在构造不同的对象,而工厂模式构建构建相同的对象。