目前,我创建了一个abcfactory类,该类具有创建ABC对象的单个方法。现在,我想到了,也许不是开工厂,而是可以在ABC方法中做出静态方法。对此更改的专业人士和骗局是什么?它不会导致同样的事情吗?我没有预见其他课程继承了ABC,但人们永远不会知道!

谢谢

有帮助吗?

解决方案

实际上,如果您想获得工厂课程的好处,则需要自己的课程中的静态方法。这将使您以后创建新的工厂类,或重新配置现有的类别以获得不同的行为。例如,一个工厂类可能会创建实现Ifourhoovedanimal接口的独角兽。您可能会写一篇算法,该算法与Ifourhoevedanimal一起做事,并且需要实例化。稍后,您可以创建一个新的工厂类,该课程代替了Pegasus的实例,该类别也实现了Ifourhoevedanimal。现在,只需使用新工厂就可以将旧算法重复使用Pegasus的算法!为了使这项工作既既需pegasusfactory又必须从某些普通基类(通常是抽象类)继承。

因此,您可以通过将静态方法放置在自己的工厂课程中,可以将工厂类交换较新的课程以重复使用旧算法。这也可用于提高可测试性,因为现在可以给单位测试提供创建模拟对象的工厂。

我之前已经完成了后者(您要创建的类实例的静态出厂方法),但这仅仅是因为我需要它来帮助重构一些旧代码,但要将更改保持在最低限度。基本上,在这种情况下,我考虑了一大堆代码,这些代码创建了一堆ASP.NET控件,并将所有这些控件塞入用户控件中。我想使我的新用户控制属性基于我的新用户控制属性,但是旧的旧代码更容易使用基于参数的构造函数创建用户控件。

因此,我创建了一个静态出厂方法,该方法获取了所有参数,然后实现了用户控件并根据参数设置其属性。旧的旧版代码使用此静态方法来创建用户控件,未来代码将使用“漂亮”属性。

其他提示

拥有单一的静态方法使得这更难测试,而拥有一个直接的对象则可以更易于测试。同样,非静态解决方案的依赖注入更多是一种选择。

当然,如果您不需要任何一个,那么这些不是很好的论点。

工厂方法的主要优点是能够隐藏对接口背后的特定类的参考。由于静态方法不能成为接口的一部分,因此静态出厂方法基本上与构造函数方法本身相同。静态工厂方法的唯一有用的应用是提供对私有构造函数的访问 - 通常用于Singleton -Pattern实现的方法。

对于具体课程,工厂方法实际上只是围绕创建实际类型的间接方法(这并不是说它们没有用,但是正如您发现的那样,工厂方法确实可以是 任何地方).

当您的方法创建接口类型的实例时,工厂方法真正发光的地方。

“ D” 鲍勃叔叔的面向对象设计的坚实原则 是“依赖性反转标准” 取决于抽象,而不是凝结。

该原则的极端追随者可能会使您的主类创建您的所有工厂,每个工厂通过界面使用其他工厂。 “新”(创建具体对象)的唯一外观将在您的主要班级和工厂中。您所有的对象都将与接口(抽象)一起使用,并从提供的工厂实施中获得具体的依赖关系。

然后,您可以非常轻松地调整或提供针对不同方案的多个主要类。

设计模式的过度使用是危险的,当您拥有具有定义界面的类层次结构或需要构建相当复杂的对象时,创建设计模式就很有意义。如果您有简单的设计,请使用简单的解决方案。因此,在您的情况下,工厂方法就足够了

是的,您是对的,这是另一种设计模式:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top