建造者模式浅谈

312 阅读2分钟

「这是我参与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);
}

同样的构建方式,但由于构建者的不同构造出了不同的对象。 image.png

三、总结

优点:封装性好,构造与表现分离。扩展性好,各个具体的构造者相互独立。

缺点:产品内部组成比较复杂,如果产品内部出现修改,那么所有构造者都要修改。

使用场景:比如游戏角色的构建,或者电子邮件的构建。

建造者模式与工厂模式的区别:建造者模式主要体现在复杂产品的构造上。旨在构造不同的对象,而工厂模式构建构建相同的对象。