建造者模式
适合阅读本专栏的人群包括:
- 想提升代码质量和架构思维的 Java 开发者
- 在工作中面对复杂业务、代码难以维护的工程师
- 想准备面试、系统复习设计模式知识的同学
阅读完本专栏,你将掌握:
- 23 种设计模式的结构、适用场景和最佳实践
- 面向对象六大设计原则的使用方式
- 如何用设计模式解决常见业务场景问题
- 如何重构低质量代码,提升扩展性与可维护性
任何问题都可以在留言区指出,作者看到后会第一时间回复。
概念总是生僻的,可以结合代码多体会多练习。
如果本文章给你带来一点点收获请点点赞支持一下,谢谢各位架构师,技术专家,专业大拿。
其他模式详解:设计模式入门
建造者模式(Builder Pattern)也叫做生成器模式是一种创建型设计模式,用于分步骤构建一个复杂对象。它允许通过分步骤创建对象并最终获得该对象,从而简化了对象的创建过程,尤其是当对象有多个可选参数时。
适用场景
- 对象构造参数多,尤其是有很多可选参数。
- 构造过程复杂,需要分步骤。
- 要创建不可变对象。
- 不同配置需共享相同构建流程。
- 希望 API 更清晰、易用(链式调用)。
与工厂模式的区别
建造者模式:用于创建一个复杂对象,它将对象的构建过程分解为多个步骤,并允许以分步骤的方式创建对象。建造者模式特别适合当一个对象的构建过程复杂且需要多步进行时。强调构建一个复杂对象。
工厂模式:用于创建对象实例,它将对象的创建过程封装在一个工厂类中,客户端只需要知道具体工厂类来获取所需的对象,而不需要关心对象的创建细节。工厂模式特别适合当对象的创建过程简单且逻辑较为固定时。
角色
建造者模式包含以下几个主要角色:
- 产品(Product):要构建的复杂对象。产品类通常包含多个部分或属性。
- 抽象建造者(Builder):定义了构建产品的抽象接口,包括构建产品的各个部分的方法。
- 具体建造者(Concrete Builder):实现抽象建造者接口,具体确定如何构建产品的各个部分,并负责返回最终构建的产品。
- 指导者(Director):负责调用建造者的方法来构建产品,指导者并不了解具体的构建过程,只关心产品的构建顺序和方式。
- 客户端 (Client) 必须将某个生成器对象与指导者类关联。 一般情况下, 你只需通过主管类构造函数的参数进行一次性关联即可。 此后主管类就能使用生成器对象完成后续所有的构造任务。 但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。 在这种情况下, 你在使用主管类生产产品时每次都可以使用不同的生成器。
UML

看到这里大家可以思考一下,我们常见的 StringBuilder 是否使用了建造者模式。
代码案例
假设我们要构建一个包含多个部分的复杂对象,比如一个具有多种属性的Computer对象。
-
创建产品类
// 一个电脑包含许多属性 public class Computer { private String CPU; private String RAM; private String storage; private String GPU; private String OS; public Computer(String CPU, String RAM, String storage, String GPU, String OS) { this.CPU = CPU; this.RAM = RAM; this.storage = storage; this.GPU = GPU; this.OS = OS; } @Override public String toString() { return "Computer [CPU=" + CPU + ", RAM=" + RAM + ", storage=" + storage + ", GPU=" + GPU + ", OS=" + OS + "]"; } } -
创建 Builder 接口
public interface ComputerBuilder { void setCPU(String CPU); void setRAM(String RAM); void setStorage(String storage); void setGPU(String GPU); void setOS(String OS); Computer build(); } -
实现 ConcreteBuilder
public class ConcreteComputerBuilder implements ComputerBuilder { private String CPU; private String RAM; private String storage; private String GPU; private String OS; @Override public void setCPU(String CPU) { this.CPU = CPU; } @Override public void setRAM(String RAM) { this.RAM = RAM; } @Override public void setStorage(String storage) { this.storage = storage; } @Override public void setGPU(String GPU) { this.GPU = GPU; } @Override public void setOS(String OS) { this.OS = OS; } @Override public Computer build() { return new Computer(CPU, RAM, storage, GPU, OS); } } -
创建 Director
public class Director { private ComputerBuilder builder; public Director(ComputerBuilder builder) { this.builder = builder; } public Computer constructGamingComputer() { builder.setCPU("Intel i9"); builder.setRAM("32GB"); builder.setStorage("1TB SSD"); builder.setGPU("NVIDIA RTX 4080Ti"); builder.setOS("Windows 11"); return builder.build(); } public Computer constructOfficeComputer() { builder.setCPU("Intel i5"); builder.setRAM("16GB"); builder.setStorage("512GB SSD"); builder.setGPU("Integrated"); builder.setOS("Windows 10"); return builder.build(); } } -
客户端使用建造者
public class Main { public static void main(String[] args) { ComputerBuilder builder = new ConcreteComputerBuilder(); Director director = new Director(builder); Computer gamingComputer = director.constructGamingComputer(); System.out.println(gamingComputer); Computer officeComputer = director.constructOfficeComputer(); System.out.println(officeComputer); } }
最后我们来回答一下之前提到的问题,StringBuilder 中是否应用了建造者模式?
❌ 严格来说,StringBuilder 并没有使用经典意义上的“建造者模式”(Builder Pattern),
✅ 但它 体现了“建造者思想”或“构建过程分步化”的理念,可以看作是一种简化版应用
使用这种模式还有一个好处就是在创建对象传参时候可以进行链式调用,那这在实际编码中就很爽了。
392

被折叠的 条评论
为什么被折叠?



