关于Builder模式中类内重复实例化类的技术疑问(自动化编码)
关于Builder模式实现的冗余与create方法疑问解答
先结论:你看到的是错误的Builder模式实现
文中的写法完全违背了Builder模式的设计初衷,才会出现你疑惑的冗余和多余调用问题。
疑问1:实例化User后create又new一个,是否冗余?
是的,这完全是冗余且不合理的。
标准Builder模式的核心是:通过一个Builder对象来收集所有需要的属性,最后一次性构建出目标对象(User),全程只会创建一次目标对象。
而文中的写法先new User(...)创建了一个实例,又在create()里重新new一个新的User,等于做了两次无用功,既浪费内存,也破坏了Builder模式的封装性。
疑问2:已经用setter设了属性,为什么还要调用create?
这也是因为实现错误导致的逻辑混乱。
标准Builder模式里,根本不会给目标对象(User)写setter方法——目标对象通常是不可变类(属性用final修饰,只有构造方法赋值),所有属性的设置都是在Builder类里完成的,create()(或标准的build())方法是第一次也是唯一一次创建User实例的地方,目的是把Builder收集的属性传入User的私有构造方法,生成最终的不可变对象。
给你看一个标准的User Builder模式实现
public class User { // 属性设为final,保证不可变 private final String username; private final String password; private final String email; // 私有构造方法,只能由内部Builder调用 private User(UserBuilder builder) { this.username = builder.username; this.password = builder.password; this.email = builder.email; } // 静态内部Builder类,负责收集属性 public static class UserBuilder { private String username; private String password; private String email; // 链式调用的属性设置方法 public UserBuilder username(String username) { this.username = username; return this; } public UserBuilder password(String password) { this.password = password; return this; } public UserBuilder email(String email) { this.email = email; return this; } // 最终构建User实例的方法 public User create() { // 这里才是第一次创建User对象 return new User(this); } } } // 使用方式(清晰且无冗余) User validUser = new User.UserBuilder() .username("john_doe") .password("secure123") .email("john@example.com") .create();
总结
你看到的文章里的代码是对Builder模式的误用,才会出现这些奇怪的冗余操作。真正的Builder模式应该是通过Builder类封装属性设置逻辑,最后一次性生成不可变的目标对象,既保证代码可读性,也避免了不必要的对象创建。
内容的提问来源于stack exchange,提问作者msmith1114
相关产品推荐
相关产品推荐

