为何在工厂方法模式示例中使用Dialog工厂而非直接选Button实现?
核心原因是工厂方法模式的本质是封装对象创建的上下文与依赖,同时让代码遵循开闭原则与单一职责,具体到这个示例来说:
职责分离,避免调用方做超出自身的工作
如果直接创建HtmlButton或WindowsButton,调用方不仅要负责选择按钮类型,还要处理按钮与对话框的集成逻辑——比如按钮的渲染位置、点击事件与对话框的联动(比如关闭对话框)。而HtmlDialog/WindowsDialog作为工厂,本身就负责管理对话框内所有组件的创建、组装与生命周期,调用方只需要使用Dialog的抽象接口(比如render())即可,不用关心内部组件细节。封装上下文关联,避免不匹配的组合
按钮的行为和它所属的对话框环境强相关:比如WindowsButton的点击事件触发的是Windows原生弹窗,HtmlButton触发的是浏览器弹窗。如果直接创建按钮,很容易出现把WindowsButton塞进HtmlDialog的错误组合。而Dialog工厂能保证创建的按钮和自身环境完全适配,从根源上避免这种问题。为后续扩展留足空间
假设后续需求扩展,对话框需要新增复选框、输入框等组件。如果用Dialog工厂,只需要给HtmlDialog加一个createCheckbox()方法、实现HtmlCheckbox,调用方的代码完全不用改——因为他们依赖的是Dialog抽象。但如果直接创建Button,调用方要新增大量判断逻辑来选择对应类型的Checkbox、Input,代码会变得臃肿且难以维护。降低耦合,依赖抽象而非具体实现
主方法里只需要依赖Dialog这个抽象类,不用知道HtmlButton、WindowsButton这些具体实现的存在。后续新增LinuxDialog和LinuxButton时,主方法只需要切换Dialog的实例化类型,其他逻辑丝毫不改,完美符合开闭原则。
内容的提问来源于stack exchange,提问作者Haricharan Reddy

