2012-02-23 4 views
0

특정 유형의 정보를 찾기 위해 (RegEx 패턴을 사용하여) 파싱해야하는 문자열 모음이 있습니다. 정보의 "유형"은 이메일 주소 또는 IP 주소 또는 FQDN 등일 수 있습니다. 소스 문자열은 단일 값 (전자 메일 주소 하나), 동일한 유형의 여러 값 (예 : 두 개의 IP 주소), 값 조합 (전자 메일 주소 및 IP 주소) 또는 아무 것도 가질 수 없습니다.이것은 공장 패턴으로 보증합니까?

발견 된 패턴을 나타 내기 위해 유형 (전자 메일, IP 등) 및 해당 값에 대한 특성을 가진 단일 클래스가 있습니다. 어떤 메소드를 사용 하던지 파싱은 0, 1, 또는 그 이상이 될 수있는 클래스의 목록을 리턴해야한다.

제 질문은이 유형의 시나리오가 공장 패턴에 적합한 지요? 생성자가 단일 클래스 인스턴스를 반환하기 때문에 문자열을 매개 변수로 전달하는 생성자를 사용할 수 없습니다.

그렇다면 추상적 인 팩토리 접근 방식에 관한 것이지만 독서 양식을 작성하는 팩토리는 다른 클래스를 반환하도록 설계되었습니다.

그런 다음 누군가가 WebRequest 클래스의 정적 Create() 메서드가 팩터 리 패턴이라는 다른 StackOverflow 질문을 읽습니다. 그래서 내 생각은 소스 문자열을 전달하여 할 수 있을까요?

업데이트 :이 응답 (http://stackoverflow.com/a/4828511/240372)을 바탕으로 "동일한 인터페이스의 고유 한 구현"이있는 경우 팩토리 패턴을 사용해야합니다. 그래서 내 요구 사항이 그 기준을 충족시키지 못합니다. 그래서 ... 나는 ... 가장 좋은 방법에 손실을 조금입니다

편집 : 내가 이메일 주소와 IP 주소의 내 예를 들어, 사용하는 사람들이 난 단지 "주소"를 처리하고 생각과 혼란을 추가 할 수 있습니다 생각합니다. 그건 사실이 아니야. 설명하기 위해 의사 코드를 추가하겠습니다.

Class TypeClass 
    Property Name As String 
    Property Pattern As String 
End Class 

Class FoundValue 
    Property TypeName As String 
    Property Value As String 
End Class 

Dim possibleTypes as List(Of TypeClass) 
possibleTypes.Add(New TypeClass() With {.Name = "Email", .Pattern = "some_regex_pattern" } 
possibleTypes.Add(New TypeClass() With {.Name = "IPAddress", .Pattern = "some_regex_pattern" } 
possibleTypes.Add(New TypeClass() With {.Name = "Date", .Pattern = "some_regex_pattern" } 
possibleTypes.Add(New TypeClass() With {.Name = "Integer", .Pattern = "some_regex_pattern" } 

Dim sourceStrings as List(Of String) 
sourceStrings.Add("hello") 
sourceStrings.Add("1.2.3.4") 
sourceStrings.Add("[email protected]; [email protected]") 
sourceStrings.Add("C:\Windows\notepad.exe 24 [email protected]") 

For Each source in sourceStrings 
    For Each type in possibleTypes 
     ' compare type.pattern to source and return list of list of FoundTypes 
     ' 
     ' for example, the last source string would return: 
     ' list containing 
     '  New FoundValue() With { .TypeName = "Integer", .Value = "24" } 
     '  New FoundValue() With { .TypeName = "Email", .Value = "[email protected]" } 
     ' 
     ' whereas the second source would return 
     ' list containing 
     '  New FoundValue() With { .TypeName = "IPAddress", .Value = "1.2.3.4" } 

감사합니다.

+0

"내 주소 구현을 사용하여 문자열을 평가하는 방법은 무엇입니까?" 나는 당신이 EmailAddress, IPAddress 등 IAddress 인터페이스 *를 구현할 수 있다고 생각한다. 공통점이 있다면 *. 그런 다음 문자열을 평가하면 IAddress 목록을 반환 할 수 있습니다. 그러나 그것은 공장 패턴이 아닙니다. – kaj

답변

0

나는 당신이 당신의 텍스트에서 "물건"의 다른 유형을 읽기위한 공통 인터페이스를 만들고 싶어처럼 나에게 소리

문젭니다 정숙 것 같아요. 아래 인터페이스를 구현하는 각기 다른 유형에 대한 구체적인 클래스를 만들 것입니다.

public interface IThingReader 
{ 
    IEnumerable<Thing> ReadThing(string content); 
} 

이 방법을 사용하면 하나의 위치로 읽기/분석/건설에게 주소의 특정 유형을 캡슐화 할 수 있습니다. 귀하의 경우 독자가 모이는 수업을 만들고 모든 결과를 조합 할 수 있습니다.예 :

public class CompositeReader 
{ 
    IThingReader[] Readers; 

    public CompositeReader(IThingReader[] readers) 
    { 
     Readers = readers; 
    } 

    public List<Thing> ParseText(string text) 
    { 
     List<Thing> allThings = new List<Thing>(); 

      foreach(IThingReader reader in Readers) 
      { 
       IEnumerable<Thing> things = reader.ReadThing(text); 
       allThings.AddRange(things); 
      } 

     return allThings; 
    } 
} 

문자열에있는 유형을 확인하고 적절한 결과를 반환해야한다면 더 유용 할 수 있습니다. 예 :

위의 예에서는 생성 할 Thing 클래스 (공통 인터페이스)의 고유 한 구현을 결정하기 위해 팩토리를 사용합니다.

0

여기에 공장 패턴이 필요하지 않은 이유는 다음과 같습니다. "동일한 인터페이스의 고유 한 구현"이 없습니다. 당신이 목록 어디 당신이 주소를 만들을 만듭니다

파서 그래서 당신이 개 생성 지점이이 스타일

List<Address> result = new empty list; 

for each found address 
     Address oneAddress = new Address 
     result.put(oneAddress) 

코드가있을 수 있습니다. 각각의 경우에 당신이 디자인을 현재 당신이 공장을 필요가 없다는 것을 의미하므로 만들려는 유형을 알고 있습니다.

대신하는 경우가

Interface Address 
Class EmailAddress implements Address 
Class IpAddress implements Address 

다음 당신이 잘 올바른 주소 개체를 만드는 공장 후두둑을 사용할 수 있었다.