建造者模式中:接口与抽象类构建器模板的最优实现方式探讨
建造者模式中构建器模板的最优实现方式?
在建造者模式场景下,构建器模板用接口还是抽象类实现,核心取决于你对封装性和代码复用的需求,两种方案的取舍非常明确:
接口实现的痛点
- 接口无法指定成员访问权限,所有方法和属性默认都是
public。比如示例里的reset()方法本应是构建器内部的初始化逻辑,却会被暴露给外部调用者,容易引发误用,破坏封装。 - 接口要求所有方法必须被实现,哪怕某些构建步骤对特定实现类是可选的,也得写空实现,代码冗余且不灵活。
接口实现代码:
// Builder interface PizzaBuilder { pizza: Pizza; reset(): void; setTomato(): this; setParmesano(): this; setPepper(): this; build(): Pizza; }
抽象类实现的优势与误区
- 抽象类可以灵活控制成员权限:比如把
pizza实例和reset()设为protected,只允许子类内部调用,避免外部误操作,完美契合建造者的封装需求。 - 你提到“所有方法都要重写,抽象类没必要”——其实这是个误区:抽象类的价值不仅在于强制规范,还能提供通用默认实现。比如如果多个构建器的
reset()逻辑都是创建新的Pizza实例,就可以在抽象类里写好默认实现,不用每个子类重复编写。
抽象类实现代码:
// Builder abstract class PizzaBuilder { protected pizza: Pizza = new Pizza protected abstract reset(): void; public abstract setTomato(): this; public abstract setParmesano(): this; public abstract setPepper(): this; public abstract build(): Pizza; }
最优选择建议
- 如果需要严格的权限控制(隐藏内部初始化、辅助方法),或者有可复用的通用逻辑,优先用抽象类。
- 如果只是需要定义一套构建规范,不涉及权限控制,且每个实现类逻辑完全独立,用接口更轻量。
内容的提问来源于stack exchange,提问作者Juan Fruto
相关产品推荐
相关产品推荐

