PHP InlineKeyboard链式调用类是否实现了建造者模式?
参考背景
参考对应InlineKeyboard类的实现,开发者可以通过链式调用逐步构建键盘对象,调用示例如下:
$keyboard = new InlineKeyboard() ->addCallbackButton('Start', 'start_callback') ->addCallbackButton('Help', 'help_callback') ->addUrlButton('FAQ', 'https://example.com/faq') ->get();
该类的get()方法会直接返回经json_encode()处理后的JSON字符串。
问题解答
针对三个关于建造者模式判定的疑问,逐一说明如下:
1. 该InlineKeyboard类是否属于建造者(Builder)模式的实现?
它不属于标准建造者模式的实现,只是采用了链式调用的写法,借鉴了建造者模式「分步构建复杂对象」的设计思路,属于简化的流畅接口实现。
2. 判定其不属于建造者模式的具体原因
标准建造者模式有几个必须满足的核心设计特征,这个实现均不匹配:
- 未做角色职责拆分。建造者模式要求「建造者」和「最终产品」是两个独立的角色:产品类负责存储最终的结构数据、提供数据访问能力;建造者类只负责按步骤组装产品部件,不承担数据存储、最终格式转换的职责。这个类把配置存储、按钮添加、JSON序列化所有逻辑都耦合在同一个类中,没有做职责边界划分。
- 缺少抽象分层,无扩展能力。标准建造者模式会定义抽象建造者接口,支持不同的具体建造者实现复用同一套构建流程,产出不同形态的同类型产品(比如同样是构建键盘,可分别实现适配不同即时通讯平台的建造者);复杂场景下还会提供指挥者(Director)角色统一管控构建步骤顺序。这个类是硬编码的具体实现,无抽象层、无扩展空间,也不存在指挥者角色。
- 无明确的部件构建抽象。它提供的
addCallbackButton、addUrlButton方法本质是直接向内部数组追加配置项,没有对「构建按钮部件」「构建键盘行部件」这类构建步骤做抽象,只是简单的参数累加。
3. 最终输出JSON字符串而非实例对象,是否意味着没有实现建造者模式?
这个点完全不构成建造者模式的判定依据。
建造者模式从未强制要求最终构建方法必须返回实例对象,只要核心的角色拆分、流程抽象符合规范,最终构建方法完全可以根据业务需求返回序列化字符串、数组、二进制流等任意格式的结果。这个实现不符合建造者模式的核心原因是职责耦合、缺少分层抽象,和它最终返回JSON还是对象没有直接关系。
内容的提问来源于stack exchange,提问作者MuhammadMP
相关产品推荐
相关产品推荐

