java设计模式-建造者模式(Builder Pattern)

151 阅读4分钟

「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战

什么是建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建一个复杂的对象。
一个 Builder 类会一步一步构造最终的对象,该 Builder 类独立于其他对象。建造者模式主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

建造者模式的具体实现

结构图

image.png 建造者模式中的四个角色:

1、Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3、Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4、Product:要创建的复杂对象

首先定义一个机器人的重要组成部分

这就是机器人模型,有头,有身体,有手,有脚。机器人都是由这个模型出来的。

package com.jony.designpattern.builder;

//机器人对象
public class Robot {
    private String head;
    private String body;
    private String hand;
    private String foot;

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getHand() {
        return hand;
    }

    public void setHand(String hand) {
        this.hand = hand;
    }

    public String getFoot() {
        return foot;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }
}

接下来定义一个造机器人的标准。一个把头、身体、手、脚造出来的标准

package com.jony.designpattern.builder;

//制造机器人接口,头 身体 手 脚
interface BuildRobot {
    public void buildHead();
    public void buildBody();
    public void buildHand();
    public void buildFoot();

    //最终返回整个机器人对象
    public Robot createRobot();
}

这样,一个建造机器人的标准就定义好了。依次创建各个部位,最后调用createRobot方法就可以返回一个我们想要的机器人。

现在机器人的模型和创建标准都有了,我们来创建一个医疗机器人

package com.jony.designpattern.builder;

//创建一个医疗机器人,
public class DoctorBuilder implements BuildRobot{
    Robot robot;

    public DoctorBuilder(){
        robot=new Robot();
    }

    @Override
    public void buildHead() {
        robot.setHead("拥有精湛的医疗技术");
    }

    @Override
    public void buildBody() {
        robot.setBody("坚强的身躯");
    }

    @Override
    public void buildHand() {
        robot.setHand("手拿手术刀");
    }

    @Override
    public void buildFoot() {
        robot.setFoot("脚穿运动鞋");
    }

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

这个医疗机器实现了BuildRobot造机器人标准的接口,最后提供了createRobot方法返回robot实体。

再来创建一个士兵机器人

package com.jony.designpattern.builder;

//创建一个士兵机器人,
public class SoldierBuilder implements BuildRobot{
    Robot robot;

    public SoldierBuilder(){
        robot=new Robot();
    }
    @Override
    public void buildHead() {
        robot.setHead("服从指令脑袋");
    }

    @Override
    public void buildBody() {
        robot.setBody("钢铁的身躯");
    }

    @Override
    public void buildHand() {
        robot.setHand("手拿冲锋枪");
    }

    @Override
    public void buildFoot() {
        robot.setFoot("脚穿大皮靴");
    }

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

创建建造者核心模块

好的,其实到这里呢,我们已经完成了建造的过程。那就这么简单的建造过程,还搞了一个建造模式吗?非也。接下来,就是介绍建造者模式的精髓,那就是director。这个director呢,就是来执行我们刚才的造人动作的。没错,精髓就是我们刚才的造人动作。我们先看代码:

package com.jony.designpattern.builder;

//建造者核心模块,调用具体建造者建造不同的机器人
public class RobotDirector {
    //管理造机器人的顺序,BuildRobot不同,建造的机器人就不同
    public Robot createRobotDirector(BuildRobot buildRobot){
        buildRobot.buildHead();
        buildRobot.buildBody();
        buildRobot.buildHand();
        buildRobot.buildFoot();
        return buildRobot.createRobot();
    }
}

建好了,这个Director类就跟个指挥官似,它有资源和工厂的。你跟它说要建造什么类型的机器人,只要传给它。它就给能你建造出来。

测试

package com.jony.designpattern.builder;

public class RobotBuildTest {
    public static void main(String[] args) {
        //生成建造者
        RobotDirector robotDirector=new RobotDirector();
        //建造士兵机器人
        Robot Soldier=robotDirector.createRobotDirector(new SoldierBuilder());
        System.out.println(Soldier.getHand());
        System.out.println(Soldier.getBody());
        System.out.println(Soldier.getHand());
        System.out.println(Soldier.getFoot());
        System.out.println("------------我是分割线------------");
        //建造医疗机器人
        Robot Doctor=robotDirector.createRobotDirector(new DoctorBuilder());
        System.out.println(Doctor.getHand());
        System.out.println(Doctor.getBody());
        System.out.println(Doctor.getHand());
        System.out.println(Doctor.getFoot());

    }
}

执行结果

image.png

现在如果我们想创建一个服务机器人,只需要创建一个娱乐机器人的Builder,然后交给Director,它就可以创建出来了。

总结:
1、通过以上代码我们可以发现,再创建其他类型机器人的时候,是很容易扩展的,没有修改之前的代码,符合开闭原则
2、代码解耦,模块化,方便维护,可以通过建造不同的Builder,就可以创建不同的产品。

缺点:
生成的产品组成部分基本相同,如我们生成机器人,都有 头、身体、手、脚。如果产品之间差异太大,就不适合建造者模式了。