You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

建造者模式中:接口与抽象类构建器模板的最优实现方式探讨

建造者模式中构建器模板的最优实现方式?

在建造者模式场景下,构建器模板用接口还是抽象类实现,核心取决于你对封装性和代码复用的需求,两种方案的取舍非常明确:

接口实现的痛点

  • 接口无法指定成员访问权限,所有方法和属性默认都是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:32:38