У меня есть коллекция строк, которые необходимо проанализировать (используя шаблоны RegEx) в надежде найти определенные типы информации. «Типы» информации могут быть адресом электронной почты, IP-адресом, полным доменным именем или чем-то еще. Исходная строка может иметь одно значение (один адрес электронной почты), несколько значений одного типа (например, два IP-адреса), сочетание значений (адрес электронной почты и IP-адрес) или ничего.
Для представления найденного шаблона у меня есть один класс, который имеет свойства для типа (email, ip и т. Д.) И его значения. Какой бы метод ни выполнял синтаксический анализ, он должен возвращать список указанного класса, где число может быть равно нулю, единице или более.
Мой вопрос: имеет ли смысл этот тип сценария для шаблона Factory? Я не могу использовать конструктор, в котором строка передается в качестве параметра, поскольку конструктор возвращает один экземпляр класса.
Тогда я рассуждаю об абстрактном подходе Фабрики, но формирую свое чтение. Фабрики предназначены для возврата разных классов.
Затем я прочитал еще один вопрос StackOverflow, где кто-то утверждает, что статический метод Create () класса WebRequest является шаблоном Factory. Итак, я думаю, могу ли я сделать это, передав исходную строку?
Обновление: на основе этого ответа (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("someone@somewhere.com; who@what.com")
sourceStrings.Add("C:\Windows\notepad.exe 24 who@what.com")
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 = "who@what.com" }
'
' whereas the second source would return
' list containing
' New FoundValue() With { .TypeName = "IPAddress", .Value = "1.2.3.4" }
Спасибо.