【问题标题】:Best practice when creating classes that are solely in charge of the creation of other objects i.e. factories?创建仅负责创建其他对象(即工厂)的类时的最佳实践?
【发布时间】:2019-06-20 09:41:42
【问题描述】:

我经常发现自己创建了以“Factory”为后缀的类。这些类往往只负责创建特定类或一组相关类。但是我一直觉得这可能不是最佳实践,并且有更好的方法来解决这个问题。我认为这不是最佳实践的原因之一是,尽管我使用的是“工厂”后缀,但实际上并没有使用工厂设计模式。

假设我有一个类Vehicle,它包含两个变量makemodel。我希望我的问题能够创建许多这些Vehicle 对象,因此我想封装代码以在单个类中创建这些对象。我可能会创建以下类。

public class VehicleFactory
{
    public Vehicle CreateVehicle(string make, string model)
    {
         //create vehicle..
         return vehicle;
    }
}

VehicleFactory 然后可以在我的程序中的任何地方使用,而无需重复代码和违反 DRY。

当我重构代码时,我经常需要创建这类工厂类,更具体地说,当我发现两个或多个创建相同对象的类时。我想通过提取重复的代码然后将其放在特定的工厂类中来重构代码。

有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: c# refactoring dry


    【解决方案1】:

    Factory 模式更适用于更复杂的场景,例如为 concrte 类提供通用接口,然后Factory 类将创建相应的具体类对象。

    在您的场景中,代码可以直接放在类的构造函数中。

    例如阅读this :)

    【讨论】:

      【解决方案2】:

      创建对象的常用方法有 3 种:

      1. 构造函数
      2. 静态工厂方法
      3. 工厂类(不是在谈论抽象工厂模式,因为您已经确定您没有使用它)

      我相信这个列表也是按优先顺序排列的。构造函数应该是首选,因为它是开发人员在寻找实例化对象时最明显的地方。缺点是构造函数有一些限制:名称必须与限制重载的类名匹配,并且构造函数必须“返回”正在构造的类。

      如果您需要提供具有相同签名的多个重载,则静态工厂方法可以派上用场(或者通常仅用于提供更具描述性的方法名称)。例如:CreateVehicleWithName(string name)CreateVehicleWithColor(string color) 不可能与构造函数一起使用。另一种情况是,如果参数无效或某些其他结果对象而不是类本身的实例,您希望允许返回 null。请注意,这些静态工厂方法通常最好定义为类的一部分。

      最后,当您的类具有复杂的构造要求并且构造函数逻辑远远超出类的其余代码时,定义单独的工厂类会很有用。如果构造需要大量额外的依赖项,工厂类也很有用。然而,这些类的缺点是开发人员需要以某种方式发现它们,而工厂的激增会导致大量额外的复杂性。

      总之,最佳实践:如果可以的话,定义一个构造函数;只有在构造函数和静态工厂方法不可行时才使用工厂类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 2013-02-06
        • 2020-07-12
        相关资源
        最近更新 更多