设计模式【4】------>建造者模式

一、什么是建造者模式

  • 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的方式进行创建。
  • 工厂类模式是提供的是创建单个类的产品
  • 而建造者模式则是将各种产品集中起来进行管理,用来具有不同的属性的产品

建造者模式通常包括下面几个角色:

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

结构图:

二、建造者模式的使用场景

使用场景:

  1. 需要生成的对象具有复杂的内部结构。
  2. 需要生成的对象内部属性本身相互依赖。
  • 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
  • JAVA 中的 StringBuilder就是建造者模式创建的,他把一个单个字符的char数组组合起来
  • String不是建造者模式,它提供的操作应该是对于字符串本身的一些操作,而不是创建或改变一个字符串。

代码案例
1、电脑角色:包含多个组成部件的复杂对象。

/**
 * 电脑角色:包含多个组成部件的复杂对象。
 */
public class Computer {
    /**
     * 主机
     */
    private String host;
    /**
     * 显示器
     */
    private String monitor;
    /**
     * 键盘
     */
    private String keyboard;

    public void setHost(String host) {
        this.host = host;
    }

    public void setMonitor(String monitor) {
        this.monitor = monitor;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public void show(){
        System.out.println("电脑组装成功...");
    }
}

2、抽象建造者:包含创建电脑各个子部件的抽象方法。

/**
 * 抽象建造者:包含创建电脑各个子部件的抽象方法。
 */
abstract class Builder {

    //创建产品对象
    protected Computer computer = new Computer();

    public abstract void buildHost();

    public abstract void buildMonitor();

    public abstract void buildKeyBoard();

    //返回产品对象
    public Computer getResult() {

        return computer;
    }

}

3、具体建造者:实现了抽象建造者接口。

/**
 * 具体建造者:实现了抽象建造者接口。
 */
public class ConcreteBuilder extends Builder {
    @Override
    public void buildHost() {
        System.out.println("建造主机...");
        computer.setHost("建造主机");
    }

    @Override
    public void buildMonitor() {
        System.out.println("建造显示器...");
        computer.setMonitor("建造显示器");
    }

    @Override
    public void buildKeyBoard() {
        System.out.println("建造键盘中...");
        computer.setKeyboard("建造键盘");
    }
}

4、指挥者:调用建造者中的方法完成复杂对象的创建。

/**
 * 指挥者:调用建造者中的方法完成复杂对象的创建。
 */
public class Director {

    private Builder builder;

    public Director(Builder builder){
        this.builder=builder;
    }

    //电脑构建与组装方法
    public Computer construct(){
        builder.buildHost();
        builder.buildMonitor();
        builder.buildKeyBoard();
        return builder.getResult();
    }
}

5、客户类。

/**
 * 客户类
 */
public class Client {
    public static void main(String[] args){
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        Computer construct = director.construct();
        construct.show();
    }
}

打印结果

 三、优缺点

主要优点如下:

  1. 封装性好,构建和表示分离。
  2. 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
  3. 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。

其缺点如下:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。

建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

 

posted @ 2021-03-21 16:38  donleo123  阅读(49)  评论(0编辑  收藏  举报