本帖最后由 白冥 于 2024-5-24 22:10 编辑
- public class House {
- private LivingRoom livingRoom;
- private Bedroom bedroom;
- private Bathroom bathroom;
- private House (Builder builder) {
- this.livingRoom=builder.livingRoom;
- this.bedroom=builder.bedroom;
- this.bathroom=builder.bathroom;
- }
- static final class Builder {
- private LivingRoom livingRoom;
- private Bedroom bedroom;
- private Bathroom bathroom;
- public Builder setLivingRoom (LivingRoom livingRoom) {
- this.livingRoom=livingRoom;
- return this;
- }
- public Builder setBedroom (Bedroom bedroom) {
- this.bedroom = bedroom;
- return this;
- }
- public Builder setBathroom (Bathroom bathroom) {
- this.bathroom = bathroom;
- return this;
- }
- public House build () {
- return new House (this);
- }
- }
- }
复制代码 建造者模式(Builder Pattern)是一种对象构建的设计模式,它允许你在一个单独的类中组合所有必要的逻辑来创建复杂对象,同时又能保持代码的可读性和封装性。建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。**建造者模式通常包括以下几个角色:** Product(产品):这是需要被构建的对象,通常包含多个组成部件或属性。 Builder(建造者):这是一个抽象接口,用于规范产品的构建步骤。它通常包含一系列用于构建产品各个部分的抽象方法,但并不涉及具体的构建细节。 ConcreteBuilder(具体建造者):这是Builder接口的实现,它提供了具体的构建逻辑,包括设置产品的各个属性和组件。一个ConcreteBuilder通常与一个未完成的产品实例相关联,并提供了建造和获取产品的方法。 Director(指挥者):这是一个负责指导ConcreteBuilder如何构建产品的类。它确保产品的构建过程按照特定的顺序进行,但它并不直接参与产品的构建工作,而是委托给ConcreteBuilder来完成。 Client(客户端):这是使用Director和ConcreteBuilder来构建产品的代码。客户端通常只需要与Director交互,而不需要关心具体的构建细节。
**建造者模式的主要优点包括:** - 封装性:建造者模式将构建复杂对象的步骤封装在ConcreteBuilder中,使得客户端代码更加简洁和清晰。
- 灵活性:通过定义不同的ConcreteBuilder类,可以轻松地改变产品的构建逻辑,而无需修改客户端代码。
- 可读性:通过使用Director类来指导构建过程,可以增加代码的可读性和可维护性。
建造者模式通常用于构建具有多个步骤和复杂组件的对象,例如,配置复杂的系统配置、创建一个包含多个部分和属性的文档或报告等。通过分离构建逻辑和表示逻辑,建造者模式使得代码更加模块化、可测试和可维护。
这段代码展示了一个典型的建造者模式实现。在这个例子中,House 类代表要被构建的产品,而 Builder 是一个内部静态类,它扮演了具体建造者的角色。Builder 类中的方法允许客户端设置 House 对象的各个组成部分,并最终通过 build() 方法构建出一个完整的 House 对象。 **这段代码的功能描述如下:** 产品(Product):House 类是产品,代表一个房子。它有三个主要组成部分:客厅(LivingRoom)、卧室(Bedroom)和浴室(Bathroom)。这些部分在 House 类中以私有成员变量的形式存在。 建造者(Builder):Builder 内部类是一个具体建造者,它负责构建 House 对象。这个类有三个私有成员变量,分别对应房子的三个部分,并提供相应的设置方法(setLivingRoom、setBedroom、setBathroom)。每个设置方法都返回 Builder 类型的实例,以便支持链式调用。最后,build() 方法用于创建并返回一个配置完成的 House 对象。 客户端使用:客户端可以通过创建 Builder 的实例,然后调用其设置方法来配置房子,并最终调用 build() 方法来获取一个完整的 House 对象。
在这个例子中,没有明确的 Director 角色,因为 Builder 自己承担了构建的逻辑。在更复杂的场景中,Director 可能会作为一个独立的类存在,用于指导 Builder 如何构建产品,这里的Builder 既包含了构建逻辑也包含了指导逻辑。
|