23种设计模式——构建器模式(Builder Pattern)详解
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏: 设计模式
✨特色专栏: 知识分享
🥭本文内容: 23种设计模式——构建器模式(Builder Pattern)详解
📚 ** ps ** : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。
目录
一、背景
二、介绍
三、核心思想
四、组成
五、Java实现示例
六、链式调用
七、构建器模式的优点
八、适用场景
一、背景
构建器模式是我放到第一个讲解的设计模式,为什么呢?因为它是一种特别常见的设计模式,并且相对于同样常见的单例模式,初次看见它会觉得很陌生。
比如下图这段安卓代码,简单几行代码它就能弹出一个登录界面,新人初次见到这种代码可能会感到疑惑。不过没事,我们下面即将讲解!
二、介绍
构建器模式一种创建型设计模式,它允许你分步骤创建复杂对象,使得相同的构建过程可以创建不同的表示。
三、核心思想
构建器模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式特别适用于以下场景(以登录界面为例):
对象有多个组成部分或复杂配置选项(比如可以给不同登录界面配置不同名称)
需要创建的对象有不同的表现形式(不同名称,表示自然不同)
对象的创建过程需要分步骤进行(比如除了设置名称,还能设置字体大小等......)
四、组成
产品(Product):最终要构建的复杂对象
抽象构建器(Builder):定义创建产品各个部件的抽象接口
具体构建器(ConcreteBuilder):实现Builder接口,构造和装配产品的各个部件
指挥者(Director):构建一个使用Builder接口的对象,控制构建过程
五、Java实现示例
// 1. 产品类 class Computer {private String CPU;private String RAM;private String storage;private String GPU;// 省略getter和setter方法@Overridepublic String toString() {return "Computer{" +"CPU='" + CPU + '\'' +", RAM='" + RAM + '\'' +", storage='" + storage + '\'' +", GPU='" + GPU + '\'' +'}';} }// 2. 抽象构建器 interface ComputerBuilder {void buildCPU(String cpu);void buildRAM(String ram);void buildStorage(String storage);void buildGPU(String gpu);Computer getResult(); }// 3. 具体构建器 class GamingComputerBuilder implements ComputerBuilder {private Computer computer;public GamingComputerBuilder() {this.computer = new Computer();}@Overridepublic void buildCPU(String cpu) {computer.setCPU(cpu);}@Overridepublic void buildRAM(String ram) {computer.setRAM(ram);}@Overridepublic void buildStorage(String storage) {computer.setStorage(storage);}@Overridepublic void buildGPU(String gpu) {computer.setGPU(gpu);}@Overridepublic Computer getResult() {return computer;} }// 4. 指挥者 class ComputerDirector {public Computer constructGamingComputer(ComputerBuilder builder) {builder.buildCPU("Intel i9");builder.buildRAM("32GB DDR5");builder.buildStorage("1TB NVMe SSD");builder.buildGPU("NVIDIA RTX 4090");return builder.getResult();}public Computer constructOfficeComputer(ComputerBuilder builder) {builder.buildCPU("Intel i5");builder.buildRAM("16GB DDR4");builder.buildStorage("512GB SSD");return builder.getResult();} }// 客户端代码 public class BuilderPatternDemo {public static void main(String[] args) {ComputerDirector director = new ComputerDirector();ComputerBuilder builder = new GamingComputerBuilder();Computer gamingComputer = director.constructGamingComputer(builder);System.out.println("Gaming Computer: " + gamingComputer);Computer officeComputer = director.constructOfficeComputer(builder);System.out.println("Office Computer: " + officeComputer);} }
六、链式调用
现代Java开发中常用的一种变体是使用链式调用(Fluent Interface):
class Computer {private String CPU;private String RAM;private String storage;private String GPU;// 私有构造器private Computer(Builder builder) {this.CPU = builder.CPU;this.RAM = builder.RAM;this.storage = builder.storage;this.GPU = builder.GPU;}public static class Builder {private String CPU;private String RAM;private String storage;private String GPU;public Builder withCPU(String cpu) {this.CPU = cpu;return this;}public Builder withRAM(String ram) {this.RAM = ram;return this;}public Builder withStorage(String storage) {this.storage = storage;return this;}public Builder withGPU(String gpu) {this.GPU = gpu;return this;}public Computer build() {return new Computer(this);}}@Overridepublic String toString() {return "Computer{" +"CPU='" + CPU + '\'' +", RAM='" + RAM + '\'' +", storage='" + storage + '\'' +", GPU='" + GPU + '\'' +'}';} }// 客户端代码 public class BuilderPatternDemo {public static void main(String[] args) {Computer computer = new Computer.Builder().withCPU("Intel i7").withRAM("16GB").withStorage("512GB SSD").withGPU("NVIDIA GTX 1660").build();System.out.println(computer);} }
七、构建器模式的优点
封装性好:客户端不必知道产品内部组成的细节
构建过程可控:可以精细控制产品的创建过程
扩展性好:增加新的具体构建器无需修改原有代码
解耦:将构建过程与产品本身分离
八、适用场景
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
当构造过程必须允许被构造的对象有不同的表示时
当需要分步骤创建对象,并且这些步骤可能有不同实现时
构建器模式在Java中广泛应用,例如StringBuilder、Locale.Builder等都是构建器模式的实现。
最后,
其它设计模式会陆续更新,希望文章对你有所帮助!