2013-05-15 1 views
3

기본 추상 클래스 인 BaseAddress에서 다음과 같은 자식 클래스 CentreAddress와 VenueAddress를 확장했습니다.단순한 팩토리 패턴 - 디자인 타임에 확장 된 구체적인 인스턴스의 속성에 값을 할당

내 Center 및 Venue 클래스에 대한 CentreAddress 및 VenueAddress의 구체적인 인스턴스를 작성하기 위해 간단한 Factory, AddressFactory를 구현할 생각이었습니다.

내 구현이지만 디자인 타임에 확장 된 구체 인스턴스의 속성에 값을 할당 할 수 없습니다.

런타임에 정확한 구체 인스턴스가 생성됩니다.

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 
+0

어떤 오류는 centre1.Address을 설정하려고 할 때 당신이 받고 있습니다. Line3? –

+3

Type BaseAddress에 Line3이라는 속성이 없다는 메시지를받는 것 같습니다. –

답변

-1

왜 당신이 보호 MustOverride 기능 CreateAddress와 공통 기본 클래스에서 센터와 장소 모두를 도출하지 않습니다 감사()? 이 파생 클래스에서이 함수를 재정 의하여해야합니다. new 키워드를 사용하여 Address 속성을 재정 의하여 주소 속성의 유형을 변경할 수도 있습니다. 제 생각에는 공장 패턴이 필요 없습니다. 그 외에도 나는 그것에 문제가있는 것을 보지 못했습니다.

+1

이 질문은 팩토리 패턴과 그 세부 사항을 사용하고 싶다는 것에 대해 매우 구체적입니다. 필요 없다고 말하는 것이 제 의견으로는 답이 아닙니다. –

+1

@RobForrest : 당신 말이 맞아요, 다음에 더 좋은 대답을 드리겠습니다. 당장은 Steven Doggart가 설명했습니다. –

1

각각 파생 형식을 반환하는 두 가지 방법으로 단일 팩토리를 갖는 것이 아무 문제가 없습니다. 예 :

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 
관련 문제