java设计模式:02-05-建造者模式

建造者模式(Builder Pattern)

建造者模式(Builder Pattern)是一种创建型设计模式,它通过一步一步的构造来创建一个复杂的对象,允许用户通过构建过程来定制他们的对象。这种模式特别适合创建复杂的对象时使用,以避免构造函数参数过多或者构造过程复杂的情况。

建造者模式的应用场景

  • 对象的创建过程复杂,需要一步一步的构造:如创建一个包含多个子对象的复杂对象。
  • 同一个构造过程可以创建不同的表示:如在不同配置下生成不同版本的对象。
  • 当创建复杂对象需要灵活的配置和顺序控制时:如创建一个复杂的UI控件或数据结构。

建造者模式的实现方式

1. 传统实现方式

思想:通过定义一个Builder接口来抽象化对象的构建步骤,每一个具体的Builder类负责实现这些步骤。Director类负责调用Builder的具体实现来构建最终的对象。

实现方式

java 复制代码
// 产品类
class Product {
    private String partA;
    private String partB;
    private String partC;

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    public void setPartC(String partC) {
        this.partC = partC;
    }

    @Override
    public String toString() {
        return "Product [partA=" + partA + ", partB=" + partB + ", partC=" + partC + "]";
    }
}

// 抽象建造者接口
interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
    Product getResult();
}

// 具体建造者类
class ConcreteBuilder implements Builder {
    private Product product = new Product();

    public void buildPartA() {
        product.setPartA("Part A");
    }

    public void buildPartB() {
        product.setPartB("Part B");
    }

    public void buildPartC() {
        product.setPartC("Part C");
    }

    public Product getResult() {
        return product;
    }
}

// 指挥者类
class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Product construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder.getResult();
    }
}

// 客户端代码
public class BuilderPattern {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        Product product = director.construct();
        System.out.println(product);
    }
}

优点

  • 将复杂对象的创建过程封装在建造者中,使得客户端代码简洁。
  • 各个建造过程可以灵活组合,便于扩展。
  • 可以控制构造的细节和顺序,提高代码的可读性和维护性。

缺点

  • 需要定义多个Builder类和Director类,增加了系统的复杂度。
  • 适用于构建过程固定的对象,不适合变化多端的对象创建。
2. 使用嵌套类实现建造者模式

思想:通过在产品类内部定义一个静态的Builder类,使得建造过程更加内聚和简洁。这种方式特别适合于需要灵活配置的对象创建。

实现方式

java 复制代码
class Product {
    private final String partA;
    private final String partB;
    private final String partC;

    private Product(Builder builder) {
        this.partA = builder.partA;
        this.partB = builder.partB;
        this.partC = builder.partC;
    }

    public static class Builder {
        private String partA;
        private String partB;
        private String partC;

        public Builder setPartA(String partA) {
            this.partA = partA;
            return this;
        }

        public Builder setPartB(String partB) {
            this.partB = partB;
            return this;
        }

        public Builder setPartC(String partC) {
            this.partC = partC;
            return this;
        }

        public Product build() {
            return new Product(this);
        }
    }

    @Override
    public String toString() {
        return "Product [partA=" + partA + ", partB=" + partB + ", partC=" + partC + "]";
    }
}

public class BuilderPatternNested {
    public static void main(String[] args) {
        Product product = new Product.Builder()
            .setPartA("Part A")
            .setPartB("Part B")
            .setPartC("Part C")
            .build();
        System.out.println(product);
    }
}

优点

  • 内部类Builder使得建造过程内聚,代码更简洁。
  • 通过链式调用的方式,灵活配置对象的各个部分。
  • 可以在产品类内部定义更多的约束和逻辑,确保对象的一致性。

缺点

  • 当产品类很复杂时,嵌套类也会变得复杂。
  • 内部类Builder不能很好地支持继承,扩展性有限。

总结

实现方式 优点 缺点
传统实现方式 将复杂对象的创建过程封装在建造者中,使客户端代码简洁 需要定义多个Builder类和Director类,增加了系统的复杂度
使用嵌套类实现 内部类Builder使建造过程内聚,代码更简洁,链式调用灵活配置 产品类复杂时,嵌套类也会变得复杂,内部类Builder扩展性有限

选择哪种实现方式应根据具体的需求和系统的复杂度来决定。如果系统中需要创建的对象结构较为复杂且构建过程需要灵活控制,传统实现方式较为合适。如果对象的创建需要灵活配置且对象结构相对固定,使用嵌套类实现的方式更加简洁和内聚。

相关推荐
appearappear3 分钟前
Mac 上重新安装了Cursor 2.2.30,重新配置 springboot 过程记录
java·spring boot·后端
CryptoRzz11 分钟前
日本股票 API 对接实战指南(实时行情与 IPO 专题)
java·开发语言·python·区块链·maven
程序员水自流13 分钟前
MySQL数据库自带系统数据库功能介绍
java·数据库·mysql·oracle
谷哥的小弟18 分钟前
Spring Framework源码解析——RequestContext
java·后端·spring·框架·源码
天远Date Lab24 分钟前
Java微服务实战:聚合型“全能小微企业报告”接口的调用与数据清洗
java·大数据·python·微服务
lizz3128 分钟前
C++操作符重载深度解析
java·c++·算法
武子康29 分钟前
Java-205 RabbitMQ 工作模式实战:Work Queue 负载均衡 + fanout 发布订阅(手动ACK/QoS/临时队列)
java·性能优化·消息队列·系统架构·rabbitmq·java-rabbitmq·mq
CodeCraft Studio30 分钟前
Vaadin 25 正式发布:回归标准Java Web,让企业级开发更简单、更高效
java·开发语言·前端·vaadin·java web 框架·纯java前端框架·企业级java ui框架
Haoea!41 分钟前
JDK21新特性-序列集合
java
快乐非自愿1 小时前
Java函数式接口——渐进式学习
java·开发语言·学习