23种设计模式之5.建造者模式

338 阅读3分钟

建造者模式就是使用简单的对象一步步的构造复杂对象,比如说你想要构造一个机器人,通常的构造器就是直接创建一个机器人的对象给你,而使用建造者模式就是一步一步来,先给你创建头,再给你创建身子,一步步最终创建一个完整的机器人对象。

下面就用代码来实现建造者模式。

首先我们需要建造机器人那么必须有机器人的实体类以及各部件的实体类:

public class Robot {
    private Head head;
    private Body body;
    private Hand hand;
    private Leg leg;
    private Foot foot;
    // set 方法省略
}
public class Body {
}
public class Hand {
}
public class Head {
}
public class Leg {
}
public class Foot {
}

所有的构建机器人都可以分为构建头、构建身体、构建手、构建腿、构建脚,抽象为机器人构建接口:

public interface RobotBuilder {
    void buildHead();
    void buildBody();
    void buildHand();
    void buildLeg();
    void buildFoot();
    Robot build();
}

XM公司想要造机器人他们实现了机器人构造接口,对所有组件的构造都进行了实现:

public class XMRobotBuilder implements RobotBuilder{

    private Robot robot = new Robot();

    @Override
    public void buildHead() {
        robot.setHead(new Head());
    }

    @Override
    public void buildBody() {
        robot.setBody(new Body());
    }

    @Override
    public void buildHand() {
        robot.setHand(new Hand());
    }

    @Override
    public void buildLeg() {
        robot.setLeg(new Leg());
    }

    @Override
    public void buildFoot() {
        robot.setFoot(new Foot());
    }

    @Override
    public Robot build(){
        return robot;
    }

}

现在虽然可以进行制造机器人了,但是缺少东西来指导整个制造的流程,所以Director出现了:

public class Director {

    private RobotBuilder robotBuilder;

    public Director(RobotBuilder robotBuilder) {
        this.robotBuilder = robotBuilder;
    }

    public Robot construct(){
        robotBuilder.buildHand();
        robotBuilder.buildBody();
        robotBuilder.buildHead();
        robotBuilder.buildLeg();
        robotBuilder.buildFoot();
        return robotBuilder.build();
    }
}

现在流水线,以及单个组件的制造者都准备齐了就可以开始制造机器人了,我们首先启动了流程的管理者Director,并告诉他让制造XM公司的机器人,然后一声令下开始建造,一个机器人就制造完成了。

public class Main {
    public static void main(String[] args) {
        Director director = new Director(new XMRobotBuilder());
        Robot robot = director.construct();
        System.out.println(robot.toString());
    }
}

运行结果如下,可以看到机器人的所有组件都制造成功了。

image.png

在上述例子中,机器人的头、身体、手、腿、脚都可以声明为接口,可以让对应XM公司自己去实现构建这些组件的细节,这里为了简单就并没有这样做,这里只是为了理解建造者模式。

建造者模式优点:

  1. 使用者不需要知道复杂对象是如何构建的。
  2. 具体的构建者是相互独立的,有利于系统的扩展。
  3. 构建者的Director角色可以由使用者承担,可以由使用者决定按照什么流程创建对象以及对对象的哪些属性进行创建,例如lombok中的@Builder注解,当他作用于实体类时,你可以使用它通过链式赋值的方式对你对象的任意多个成员变量初始化,而不会受限于类中没有你想要的构造函数。

建造者模式缺点:

  1. 你所构建的产品必须有共同点。
  2. 每一个产品都必须有对应的建造类,增加了系统的复杂度。