Builder模式build()方法两种返回方式的差异探究
Builder模式中两种build()实现的差异分析
方式1:直接返回内部构建的Maze实例
@Override public Maze build() { return maze; }
- 核心特点:返回的是Builder内部持有的同一个实例引用。外部拿到对象后,对它的任何修改都会直接影响Builder内部的maze对象;如果Builder后续被复用(比如未重新调用
builder()就继续添加房间),之前返回的对象也会跟着变化。 - 优劣:没有额外对象创建开销,性能高,但线程不安全,且无法保证构建完成后对象状态的稳定性——外部修改会破坏Builder原本构建的结果。
方式2:通过拷贝构造返回新的Maze实例
@Override public Maze build() { return new Maze(maze); }
- 核心特点:假设
new Maze(maze)是拷贝构造逻辑,返回的是全新的独立实例。外部对返回对象的修改不会影响Builder内部的maze,Builder后续操作也不会干扰已返回的对象。 - 优劣:能保证构建完成后对象状态的隔离性,线程安全风险更低,但会产生对象拷贝的性能开销,若Maze对象包含大量复杂数据,开销会更明显。
适用场景参考
- 如果Maze是不可变对象(所有属性为final,无修改方法),方式1完全适用,因为外部无法修改实例,不会有状态污染问题。
- 如果Maze是可变对象,且希望构建完成后实例状态不能被随意修改,或者Builder可能被多次复用,方式2是更稳妥的选择。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

