首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂方法模式扩展

工厂方法模式扩展
EN

Stack Overflow用户
提问于 2021-04-20 09:28:40
回答 1查看 87关注 0票数 1

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

代码语言:javascript
复制
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对象创建的。如果我想通过传递整个MasterProject对象或一个字符串来创建restResponse,我将如何处理呢?我有几种方法在下面分享,但我想知道哪一种是最正确的(遵循工厂方法模式)?

#1

从我看到和读到的关于工厂方法设计模式的文章来看,像上面的例子一样拥有GetProject方法是很有用的,这样我们就可以在返回项目之前进行任何必要的操作。在此之后,我可以检查传递变量的类型,并调用相应的具有字符串重载和对象重载的CreateProject方法:

代码语言:javascript
复制
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)的类型并使用它构造对象。我不知道这是否符合工厂的方法模式。

代码语言:javascript
复制
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

我只想指出,我知道没有必要按照这一模式写信。模式是以最适合的方式来使用的。我只是在寻找一条通用的最佳实践规则。

EN

回答 1

Stack Overflow用户

发布于 2021-04-20 10:50:20

我不是Visual程序员,但我知道.NET是如何工作的。如果projectID确实是一个String,那么它是否是将String转换为String的解决方案?

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67176148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档