Skip to content

建造者模式

介绍

在Java编程中,当我们需要创建具有多个属性的复杂对象时,如果允许这些属性有大量的组合配置,那么使用传统的构造函数或setter方法可能会导致代码的可读性和可维护性下降。

这时,建造者模式(Builder Pattern)就可以派上用场。

建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

概念

建造者模式属于创建型设计模式,它提供了一种创建对象的最佳方式。 建造者模式将对象的构建过程拆分为多个步骤,每个步骤可以在一个单独的方法中实现。 客户端不直接调用这些步骤,而是通过调用一个指挥类(Director)来执行这些步骤,从而创建对象。

结构

建造者模式通常包含以下几个角色:

  1. 产品(Product):通常是一个复杂的对象,包含多个部件或属性
  2. 建造者(Builder):定义了一个创建产品所需的操作的接口,通常包含多个与产品部件相关的构建方法。
  3. 具体建造者(ConcreteBuilder):实现了Builder接口,构建和装配产品的各个部件。
  4. 指挥者(Director):负责调用建造者对象中的部件构造方法来创建产品实例。

代码案例

下面是一个简单的Java代码案例来展示建造者模式的应用:

java
// 产品类  
public class Computer {  
    private String cpu;  
    private String ram;  
    private String hardDisk;  
  
    private Computer(Builder builder) {  
        this.cpu = builder.cpu;  
        this.ram = builder.ram;  
        this.hardDisk = builder.hardDisk;  
    }  
  
    // 产品的getter方法  
    public String getCpu() {  
        return cpu;  
    }  
  
    public String getRam() {  
        return ram;  
    }  
  
    public String getHardDisk() {  
        return hardDisk;  
    }  
  
    // 静态内部类作为建造者  
    public static class Builder {  
        private String cpu;  
        private String ram;  
        private String hardDisk;  
  
        public Builder setCpu(String cpu) {  
            this.cpu = cpu;  
            return this;  
        }  
  
        public Builder setRam(String ram) {  
            this.ram = ram;  
            return this;  
        }  
  
        public Builder setHardDisk(String hardDisk) {  
            this.hardDisk = hardDisk;  
            return this;  
        }  
  
        public Computer build() {  
            return new Computer(this);  
        }  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        // 使用建造者构建电脑对象  
        Computer computer = new Computer.Builder()  
                .setCpu("Intel Core i7")  
                .setRam("16GB DDR4")  
                .setHardDisk("1TB SSD")  
                .build();  
  
        // 打印电脑配置  
        System.out.println("CPU: " + computer.getCpu());  
        System.out.println("RAM: " + computer.getRam());  
        System.out.println("Hard Disk: " + computer.getHardDisk());  
    }  
}

在上面的代码中,我们定义了一个Computer类作为产品,并包含一个静态内部类Builder作为建造者。

Builder类提供了设置电脑各个部件的方法,并且每个设置方法都返回Builder对象本身,以便可以链式调用。

最后,通过build方法构建并返回Computer对象。

在Client类的main方法中,我们使用了建造者模式来构建电脑对象,并设置了各个部件的值。最后,我们打印出电脑的配置信息。

优缺点

优点:

  1. 封装性好:建造者模式封装了一个复杂对象的构建过程及其表示,使得同样的构建过程可以创建不同的表示。用户只需要指定需要创建的对象类型和内容,建造者模式会自动进行对象的构建
  2. 易于扩展:建造者模式具有很好的扩展性。当需要增加新的产品时,只需要增加一个新的具体建造者类,并在原有的建造者管理器类中增加一个对应的创建方法即可,无需修改已有的代码,符合开闭原则
  3. 便于控制细节:建造者模式可以将一个复杂对象的构建过程分解为多个相对简单的步骤,每个步骤由一个具体建造者类来负责。这使得用户可以更加细致地控制对象的构建过程,以及各个部分之间的组装方式

缺点:

  1. 可能产生多余的建造者对象:如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统中类的个数增加,在一定程度上增加了系统的复杂性
  2. 产品必须有共同点:并不是所有的系统都适合使用建造者模式,只有在需要生成的产品对象具有较多的共同点,而生成的又具有较大的差异性时,使用建造者模式才比较合适

综上所述,建造者模式在封装性、扩展性和控制细节方面具有显著优点,但也可能导致系统中类的个数增加和有一定的使用限制。 因此,在选择是否使用建造者模式时,需要根据具体的应用场景和需求进行权衡。

总结

建造者模式是一种非常实用的设计模式,它可以帮助我们更好地构建复杂对象,并提高代码的可读性和可维护性。

通过合理地使用建造者模式,我们可以使代码更加优雅、灵活和易于扩展。