【问题标题】:Factory method pattern extension工厂方法模式扩展
【发布时间】:2021-04-20 09:28:40
【问题描述】:

我有一个Project 类,可以将其子类化为MasterProjectSubProject。我正在使用工厂方法模式来创建这些类的实例。对于这个问题,只有MasterProject 很重要。以下是ProjectFactory.vb 文件:

Public MustInherit Class ProjectFactory
    Protected MustOverride Function CreateProject(restResponse As Object) As Project
    Public MustOverride Function GetProject(restResponse As Object) As Project
End Class

Public Class MasterProjectFactory
    Inherits ProjectFactory

    Protected Overrides Function CreateProject(projectID As Object) As Project
        Return New MasterProject(projectID("Project_mpBaseProjectID_c"))
    End Function

    Public Overrides Function GetProject(projectID As Object) As Project
        Dim masterProject = CreateProject(projectID)

        Return masterProject
    End Function

End Class

Public Class SubProjectFactory
    Inherits ProjectFactory

    Protected Overrides Function CreateProject(restResponse As Object) As Project
        ' Do stuff
    End Function

    Public Overrides Function GetProject(restResponse As Object) As Project
        ' Do stuff
    End Function
End Class

目前,MasterProject 是使用 restResponse 对象创建的。如果我想选择通过传递整个restResponse 对象或单个字符串来创建MasterProject,我该怎么做?我想到了几种方法,我将在下面分享,但我想知道哪种方法最正确(遵循工厂方法模式)?

#1

根据我对工厂方法设计模式的了解和了解,使用上面示例中的GetProject 方法很有用,因此我们可以在返回项目之前进行任何必要的操作。之后,我可以检查传递的变量的类型,并调用相应的CreateProject方法,该方法具有字符串重载和对象重载:

Public Class MasterProjectFactory
    Inherits ProjectFactory

    Protected Overrides Function CreateProject(projectID As Object) As Project
        Return New MasterProject(projectID("Project_mpBaseProjectID_c"))
    End Function

    Protected Overloads Function CreateProject(projectID As String) As Project
        Return New MasterProject(projectID)
    End Function

    Public Overrides Function GetProject(projectID As Object) As Project
        Dim masterProject As MasterProject

        If projectID.GetType() Is GetType(String) Then
            masterProject = CreateProject(projectID)
        Else
            masterProject = CreateProject(projectID)
        End If

        Return masterProject
    End Function
End Class

但我在这里看到的问题是我无法区分我正在调用的 CreateProject 方法。也许在 VB.NET/C# 中有一种方法可以指定这一点,但我想知道这是否是一个好习惯?

#2

对我来说更有意义的第二个选项是简单地检查传递的参数projectID(第一个代码块中的restResponse)的类型并用它构造对象。我不知道这是否遵循工厂方法模式。

Public Class MasterProjectFactory
    Inherits ProjectFactory

    Protected Overrides Function CreateProject(projectID As Object) As Project
        If projectID.GetType() Is GetType(String) Then
            Return New MasterProject(projectID)
        Else
            Return New MasterProject(projectID("Project_mpBaseProjectID_c"))
        End If
    End Function

    Public Overrides Function GetProject(projectID As Object) As Project
        Dim masterProject = CreateProject(projectID)

        Return masterProject
    End Function
End Class

我只想指出,我知道没有必要一字不差地遵循模式。模式在情境中以最适合的方式使用。我只是在这里寻找一个通用的最佳实践规则。

【问题讨论】:

  • 您能否引用著名的 Factory 模式的著名来源? GoF 定义了 Abstract FactoryFactory Method 模式,但没有仅命名为 Factory 的模式。除了 GoF 之外,还有其他模式来源,但我想知道为什么人们一直提到表面上的 Factory 模式。它是在哪里定义的?
  • 有这么多Objects 有什么特别的原因吗?另外顺便说一句,使用TypeOf ... Is 比使用... .GetType() Is 更规范VB,尽管它们应该具有相同的效果。
  • 除非您的两个功能大大简化,否则我不确定#1 有什么意义。如果它们是这样的单行,那么您不妨全部内联——如果它变得更复杂,可以稍后转换回来。
  • 我在签名中使用了Object,因为我只想将 REST 调用结果传递给工厂并让工厂进行所有初始化,而不是传递 "Project_mpBaseProjectID_c" 属性。我本可以刚刚超过所需的属性,但我觉得这种方式更具可扩展性。

标签: vb.net design-patterns factory factory-pattern


【解决方案1】:

我不是 Visual Basic 程序员,但我知道 .NET 的工作原理。如果确实是String,将projectID 转换为String 是否是一种解决方案?

Public Overrides Function GetProject(projectID As Object) As Project
    Dim masterProject As MasterProject

    If projectID.GetType() Is GetType(String) Then
        masterProject = CreateProject(CType(projectID, String))
    Else
        masterProject = CreateProject(projectID)
    End If

    Return masterProject
End Function

【讨论】:

  • 这回答了我如何区分第一种情况下的两个重载方法。但我仍然不确定解决这个问题的更好方法是什么。我是否过于关注实施的细节,还是一种方式比另一种更好?
  • @lukaabra 抱歉,我可能误解了这个问题。我认为 Craig 在 cmets 中有一个很好的观点。既然这么简单,为什么还需要重载?
  • 说实话,我不知道。这就是我问的原因。也许我只是想过度设计它。
  • @lukaabra 设计模式是针对上下文中常见问题的通用解决方案。如果你没有问题,那么你不需要解决方案。
  • 我在学习设计模式时陷入了最常被提及的陷阱之一 - 试图在任何地方实现它们并过度思考它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多