【发布时间】:2021-04-20 09:28:40
【问题描述】:
我有一个Project 类,可以将其子类化为MasterProject 或SubProject。我正在使用工厂方法模式来创建这些类的实例。对于这个问题,只有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 Factory 和 Factory Method 模式,但没有仅命名为 Factory 的模式。除了 GoF 之外,还有其他模式来源,但我想知道为什么人们一直提到表面上的 Factory 模式。它是在哪里定义的?
-
有这么多
Objects 有什么特别的原因吗?另外顺便说一句,使用TypeOf ... Is比使用... .GetType() Is更规范VB,尽管它们应该具有相同的效果。 -
除非您的两个功能大大简化,否则我不确定#1 有什么意义。如果它们是这样的单行,那么您不妨全部内联——如果它变得更复杂,可以稍后转换回来。
-
我在签名中使用了
Object,因为我只想将 REST 调用结果传递给工厂并让工厂进行所有初始化,而不是传递"Project_mpBaseProjectID_c"属性。我本可以刚刚超过所需的属性,但我觉得这种方式更具可扩展性。
标签: vb.net design-patterns factory factory-pattern