为什么避免工厂模式的条件逻辑是好的?

Why avoiding conditional logic of Factory pattern is good?

抽象工厂模式的好处之一是避免了工厂模式的条件逻辑。然而,这种方法需要更多 class es、更多代码、更多单元测试,并且不会使代码既不快速也不可读,因此代码 class 图表或文档。那么,在这种情况下,工厂模式没有条件逻辑有什么意义呢?

抽象工厂模式的好处不是避免条件逻辑,而是使调用工厂的代码更加抽象。

想象一下,代码属于您的软件架构中一个非常抽象的层(例如,业务领域层)。如果您使用工厂模式,它涉及一个具体的 Factory class,知道很多细节(例如,数据库的 API,第 3 方 Framework/Library 的 API),那么您的业务领域层将取决于这些细节。这减少了重用层的机会,因为每次重用它时,这些细节都必须存在。从架构的角度来看,你真的不想要这种依赖。

在 OOP 中有一个通用的 "goal" 可以用多态替换条件逻辑(if-else、switch 等)。这通常涉及创建一个抽象 class 或接口,并从那里创建您可能需要的对象范围。

好处是可以添加新的派生 classes,而无需添加新代码。典型的例子是不同的形状 classes(正方形、圆形、三角形等),它们都是从基本形状 class 派生出来的。例如,每个新形状都提供自己的 draw() 实现。

这同样适用于抽象工厂,其目的是为组件或类似组件提供多个 "sets of objects"。规范(人为的)示例是为应用程序提供正确的 UI 对象集,以便在 Windows、Mac、X windows 等下工作。 这个想法是将正确的工厂对象传递给应用程序,并允许它创建目标环境所需的一组正确的 UI 对象集。

如果没有此构造,应用程序将需要传递一个参数,如 "Windows",并使用 "dreaded" 条件逻辑来确定要使用工厂方法创建哪些对象。

大多数人会同意,如果"sets of objects"的数量少且固定,那就继续使用条件逻辑和工厂方法。但是,如果这种情况发生变化,那么您将面临代码更改。

如果您使用抽象工厂添加一个新的 "set of objects",您只需创建一个新的抽象工厂的子class,而不需要更改您的应用程序代码。这是更具可读性和可扩展性,在大型系统中备受推崇的属性。

即 "the point in not having conditional logic on Factory pattern" 但始终根据您自己的业务需求进行判断。