我有下面的子类CentreAddress和VenueAddress,它们是从一个基抽象类BaseAddress扩展而来的。
我正在考虑实现一个简单的工厂,AddressFactory来处理为我的中心和场所类创建CentreAddress和VenueAddress的具体实例。
但是,我的实现不允许我在设计时为扩展的具体实例的属性赋值。
在运行时,将创建正确的具体实例。
我可以更改Centre.Address和Venue.Address的返回类型--但这肯定会破坏AddressFactory是应用程序中唯一引用具体类的部分的优势?
我的实现是否正确和/或该模式在这里不是很好,即。试图在不需要的时候添加一个模式?下面的代码。
谢谢
Sub Main()
Dim centre1 = New Centre
centre1.Name = "Centre 1"
centre1.Address.Line1 = "Address Line 1"
centre1.Address.Line2 = "Address Line 2"
'centre1.Address.Line3 = "Address Line 3" not allowed
Dim venue1 = New Venue
venue1.Name = "Venue 1"
venue1.Address.Line1 = "Address Line 1"
venue1.Address.Line2 = "Address Line 2"
'venue1.Address.County.Name = "Bath and NE Somerset" not allowed
End Sub
Public Class CentreAddress
Inherits BaseAddress
Public Property Line3 As String
End Class
Public Class VenueAddress
Inherits BaseAddress
Public Property County As County
End Class
Public Class County
Public Property Name As String
End Class
Public Class Centre
Private m_address As BaseAddress
Public Property Name As String
Public ReadOnly Property Address As BaseAddress
Get
If m_address Is Nothing Then
m_address = AddressFactory.CreateAddress(Me)
End If
Return m_address
End Get
End Property
End Class
Public Class Venue
Private m_address As BaseAddress
Public Property Name As String
Public ReadOnly Property Address As BaseAddress
Get
If m_address Is Nothing Then
m_address = AddressFactory.CreateAddress(Me)
End If
Return m_address
End Get
End Property
End Class
Public Class AddressFactory
Public Shared Function CreateAddress(objectType As Object) As BaseAddress
If TypeOf objectType Is Venue Then
Dim venueAddress As New VenueAddress With {.County = New County}
Return venueAddress
ElseIf TypeOf objectType Is Centre Then
Return New CentreAddress
Else
Return New VenueAddress
End If
End Function
End Class发布于 2013-05-15 21:17:59
拥有两个不同方法的单个工厂并没有错,每个方法都返回特定的派生类型。例如:
Public Class AddressFactory
Public Shared Function CreateCentreAddress() As CentreAddress
Return New CentreAddress()
End Function
Public Shared Function CreateVenueAddress() As VenueAddress
Return New VenueAddress()
End Function
End Class通常,这正是您想要和需要的工厂类型。当特定于派生的属性不适用时,您仍然具有这样的优势,即可以编写公共代码来处理基址。例如:
Public Sub DoSomethingWithVenue()
Dim venueAddress As VenueAddress = factory.CreateVenueAddress()
venueAddress.County = New County()
' ...
DoSomethingWithAnyAddress(venueAddress)
End Sub
Public Sub DoSomethingWithCentre()
Dim centreAddress As CentreAddress = factory.CreateCentreAddress()
centreAddress.Line3 = "my line 3"
' ...
DoSomethingWithAnyAddress(centreAddress)
End Sub
Public Sub DoSomethingWithAnyAddress(address As BaseAddress)
address.Name = "my name"
' ...
End Sub但是,有时您确实需要工厂将对象作为基类型返回,但这只是在您有需要创建对象的公共代码时才需要,而不关心创建的是哪种特定的派生类型。这里似乎不是这样,所以我不会把你自己画到一个不必要的角落里。如果你将来确实需要做类似的事情,你仍然可以通过创建新的工厂类来重用原来的工厂类来做到这一点:
Public Interface IAddressFactory
Public Function CreateAddress() As BaseAddress
End Interface
Public Class VenueAddressFactory
Implements IAddressFactory
Private _factory As New AddressFactory()
Public Function CreateAddress() As BaseAddress
Return _factory.CreateVenueAddress()
End Function
End Class
Public Class CentreAddressFactory
Implements IAddressFactory
Private _factory As New AddressFactory()
Public Function CreateAddress() As BaseAddress
Return _factory.CreateCentreAddress()
End Function
End Class
Public Class CommonAddressBusiness
Public Sub New(factory As IAddressFactory)
_factory = factory
End Sub
Private _factory As IAddressFactory
Public Sub DoSomething()
Dim someTypeOfAddress As BaseAddress = _factory.CreateAddress()
' ...
End Sub
End Class发布于 2013-05-15 21:02:59
为什么不从一个带有受保护的MustOverride函数CreateAddress()的公共基类派生中心和场所呢?您只需在相应的派生类中重写此函数。您甚至可以通过使用new关键字覆盖Address属性来更改它的类型。在我看来,没有必要使用工厂模式。除此之外,我看不出它有什么问题。
https://stackoverflow.com/questions/16565517
复制相似问题