建造者模式

我们这里就不说定义了,定义太抽象,说了也不一定能明白,我自己其实也记不住,我就直接说说我个人的理解,用白话文来表述

打个比方,你要盖一栋房子,你得找个会盖房子的人来,它就是建造者,但是盖一栋什么样的房子呢,那就由你自己决定,比如,我要盖一栋3层高的房子,好,它就给你盖3层高,你说我不要电梯,只要楼梯,那就只有楼梯,你说房顶要尖的,那就是尖的,你说窗户要是圆形的,那窗户就圆形的

适用场景

  1. 对象内部组成过于复杂(属性较多)
  2. 同样的调用创建不同的对象

看代码,我们用电脑做示例

/**
 * 建造者模式:链式调用
 */
public class Computer {

    private String computerName;
    private String computerCpu;
    private String cpmputerMemory;

    public Computer(ComputerBuilder computerBuilder){
        this.computerName = computerBuilder.computerName;
        this.computerCpu = computerBuilder.computerCpu;
        this.cpmputerMemory = computerBuilder.cpmputerMemory;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "computerName='" + computerName + '\'' +
                ", computerCpu='" + computerCpu + '\'' +
                ", cpmputerMemory='" + cpmputerMemory + '\'' +
                '}';
    }

    //静态内部类
    public static class ComputerBuilder{
        private String computerName;
        private String computerCpu;
        private String cpmputerMemory;


        public ComputerBuilder builderComputerName(String computerName){
            this.computerName = computerName;
            return this;
        }

        public ComputerBuilder builderComputerCpu(String computerCpu){
            this.computerCpu = computerCpu;
            return this;
        }

        public ComputerBuilder builderComputerMemory(String computerMemory){
            this.cpmputerMemory = computerMemory;
            return this;
        }

        public Computer builder(){
            return new Computer(this);
        }
    }
}

解读一下代码,我们创建了一个Computer电脑类,这个类中还有一个ComputerBuilder的静态内部类,然后在ComputerBuilder类中写了几个对应属性的builderXXXX方法,在方法中对属性进行赋值,这些方法返回的就是ComputerBuilder本身,这也是可以链式调用的关键,最后有一个builder方法,这个方法返回的是Computer,里面new了一个Computer对象,往构造方法中传递自己

看看测试代码

public class Test {

    public static void main(String[] args) {
        Computer computer = new Computer.ComputerBuilder()
                .builderComputerName("华为电脑")
                .builderComputerCpu("I7")
                .builderComputerMemory("16G")
                .builder();
                
        System.out.println(computer);
    }
}

很眼熟吧,这就是链式调用了,建造者模式这种链式调用的方式,在Java中用的很多,这里的Computer只负责创建电脑,至于是什么电脑,由我们自己决定,你想要什么电脑,它就给你建造一个什么电脑出来

其实建造者模式跟工厂模式很类似,但不同的是,工厂模式创建出来的对象都是一样的,另外,你想要其它不同的电脑,就得创建不同的工厂来实现,而建造者模式不一样,想要什么你自己可以定义的,比如电脑中还包含了声卡,但是,你可以建造出没有声卡的电脑

但是建造者的缺点和抽象工厂很像,就是在内部新增需求的时候,就需要改动代码了,比如你这电脑本身没有人脸ID,但是你想加上这么一个属性或者功能,就要修改Computer这个类了,至于改动的成本大还是小,得根据具体的业务来砍了

上一篇:Google Computer Engine入门


下一篇:设计模式(Java语言)- 建造者模式