首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

设计模式之建造者(Builder)

2024-12-18 来源:化拓教育网

介绍

建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。

使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。

UML类图

建造者(Builder)模式类图

角色介绍

  • Product 产品类 : 产品的抽象类;
  • Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程;
  • ConcreteBuilder: 具体的构建器;
  • Director:统一组装过程(可省略)

Builder模式简单实现

Builder模式最典型的例子,就是组装电脑的例子了

创建产品类

public class Computer {

    private String cpu;
    private String ram;

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getRam() {
        return ram;
    }

    public void setRam(String ram) {
        this.ram = ram;
    }
}

创建Builder类: 组装电脑有一套组装方法的模版,就是一个抽象的Builder类,里面提供了安装CPU、内存的方法,以及组装成电脑的create方法

public interface Builder {

    public void buildCpu(String cpu);
    public void buildRam(String ram);

    public Computer create();
}

实现了抽象的Builder类,ComputerBuilder类用于组装电脑:

public class ComputerBuilder implements Builder{
    private Computer computer = new Computer();

    @Override
    public void buildCpu(String cpu) {
        computer.setCpu(cpu);
    }

    @Override
    public void buildRam(String ram) {
        computer.setRam(ram);
    }

    @Override
    public Computer create() {
        return computer;
    }
}

客户端调用指挥者类
最后商家用指挥者类组装电脑。我们只需要提供我们想要的CPU,内存就可以了,至于商家怎样组装的电脑我们无需知道。

public class Client {

    public static void main(String[] args) {

        Builder builder = new ComputerBuilder();
        Director director = new Director(builder);

        //组装电脑
        Computer computer = director.createComputer("i5-3210","DDR4");
        System.out.println(">>>>cpu:"+computer.getCpu()+
                              " ram:"+computer.getRam());
    }
}

运行结果:
>>>>cpu:i5-3210 ram:DDR4

Builder模式变种(常用)

通过静态内部类等方式实现的零件无序话构造:


public class Computer {

    private String cpu;
    private String ram;

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getRam() {
        return ram;
    }

    public void setRam(String ram) {
        this.ram = ram;
    }

    public static class Builder {
        private Computer computer = new Computer();

        public Builder setCpu(String cpu) {
            computer.setCpu(cpu);
            return this;
        }

        public Builder setRam(String ram) {
            computer.setRam(ram);
            return this;
        }

        public Computer create() {
            return computer;
        }
    }
}

客户端调用

public class Client {

    public static void main(String[] args) {

        Computer.Builder builder = new Computer.Builder();
        Computer computer = builder.setCpu("i5-3210")
                .setRam("DDR4").create();

        System.out.println(">>>>cpu:"+computer.getCpu()+
                              " ram:"+computer.getRam());
    }
}

运行结果:
>>>>cpu:i5-3210 ram:DDR4

总结

  • 定义一个静态内部类Builder,内部的成员变量和外部类一样
    Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)。
  • Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder。
  • 外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值。
显示全文