工厂设计模式中具体工厂方法的创建时机及示例适配疑问
工厂模式实现问题解答
先顺手指出你当前代码的3个可优化点,避免运行出问题:
Dog类的CreateLeg方法存在笔误,当前输出内容为"Dog body created",和方法语义不符,应调整为对应腿部创建的提示- Main方法中的非法参数提示写为
"Invalid Card Type",和当前动物创建场景不匹配,建议改为"Invalid Animal Type" AnimalFactory.CreateAnimal方法中未对null场景做拦截,如果传入不支持的动物类型,直接调用CreateBody()、CreateLeg()会抛出空引用异常,建议增加null判断后再执行初始化逻辑。
什么场景适合使用带具体工厂的工厂方法模式
你当前写的AnimalFactory属于简单工厂实现,和带具体工厂的工厂方法模式没有绝对的优劣,只有适用场景的区别,当出现以下情况时,更适合拆分具体工厂:
- 产品类型会持续频繁新增:简单工厂每新增一个产品就要修改内部的if/else分支,违反开闭原则;如果后续你要持续加新的动物类型(比如鸟、鱼、兔子),拆分具体工厂后,只需要新增对应产品的工厂类,不需要修改已经稳定运行的原有工厂代码,避免引入旧逻辑bug。
- 不同产品的初始化逻辑差异极大:如果后续Dog的创建除了造身体、造腿,还要加植入芯片、打疫苗的步骤,Cat的创建要加剪指甲、做驱虫的步骤,所有逻辑堆在同一个简单工厂的分支里会让代码快速臃肿到难以维护;拆分独立的
DogFactory、CatFactory后,每个工厂只负责对应产品的全流程创建,职责单一,维护成本更低。 - 需要对产品创建做差异化的流程管控:比如你要给Cat的创建加参数校验、给Dog的创建加操作日志,这些逻辑和其他产品无关,放在统一工厂里会增加不必要的分支判断,拆分具体工厂后可以独立给单个产品的创建流程加逻辑,不影响其他产品。
- 需要配合依赖注入做运行时动态切换:拆分具体工厂时可以先抽一层统一的抽象工厂接口,上层调用只依赖抽象接口,运行时可以根据配置、AB测试规则动态注入不同的工厂实现,不需要修改上层调用代码。
当前动物创建演示示例是否需要引入具体工厂实现
完全不需要。
设计模式的核心是解决对应场景的维护痛点,不是为了套模式而套模式。你当前的演示场景只有Cat、Dog两种固定产品,初始化逻辑非常简单,也没有频繁扩展产品的需求,现有简单工厂的实现已经足够简洁好用。
如果硬要在这个简单场景里套具体工厂实现,会凭空多出抽象工厂接口、DogFactory、CatFactory等多个类,把几行代码能搞定的逻辑变的冗余复杂,属于典型的过度设计。
只有当简单工厂的维护成本(改分支的风险、代码臃肿度)已经超过拆分多个工厂类的成本时,再引入具体工厂才是合理的选择。
内容的提问来源于stack exchange,提问作者Rasik
相关产品推荐
相关产品推荐

