在Facade(外观模式)外部创建对象再传入是否违反该设计模式规范?
外观模式外部传入依赖对象的合规性解答
你这种将子系统对象提前在外部实例化后再传入Facade的实现方式,完全不违反外观模式的设计规则,不属于不规范实现。
外观模式的核心设计目标是为复杂的多个子系统接口提供统一的高层入口,降低调用方的使用成本,从来没有强制要求Facade必须在内部完成所有依赖子系统的实例化。大家常见的Facade内部实例化子系统的写法,只是适配「子系统配置固定、不需要外部定制」场景的最简实现,不是外观模式的强制要求。
这种外部注入依赖的实现方式反而具备额外的优势:
- 灵活度更高:可以在不修改Facade代码的前提下,自由调整子系统的初始化参数,适配不同的业务需求
- 可测试性更强:做单元测试时可以直接传入Mock的子系统对象,无需耦合Facade内部的实例化逻辑,测试成本更低
- 符合依赖注入的设计思想:Facade仅依赖子系统的抽象接口,不负责子系统实例的生命周期管理,权责拆分更合理
如果需要兼顾简易使用的需求,还可以给Facade的构造方法加默认值,兼容两种使用场景:
class Facade: def __init__(self, class_a=None, class_b=None): self.class_a = class_a or A(1,2,3) self.class_b = class_b or B(3,4,5)
参考实现代码
class A: def __init__(self , a ,b, c): self.a = a self.b = b self.c = c def do_something_a(self): print(self.a, self.b, self.c) class B: def __init__(self, d, e, f): self.d = d self.e = e self.f = f def do_something_b(self): print(self.d, self.e, self.f) class Facade: def __init__(self, class_a, class_b): self.class_a = class_a self.class_b = class_b def do(self): self.class_a.do_something_a() self.class_b.do_something_b() # 外部实例化子系统后传入Facade a = A(1,2,3) b = B(3,4,5) f = Facade(a,b) f.do()
内容的提问来源于stack exchange,提问作者Ido Rozin
相关产品推荐
相关产品推荐

