Полагаю, что задача довольно типичная и для ее решения должен подходить какой-то из паттернов.
Итак, исходные условия
1. Маленькая библиотека, пишется на C#, предполагается использование только в среде .NET, соответственно использование того, что получится, должно быть максимально удобным в контексте языка C#
2. Пишется библиотека для разбора и обработки некоторых данных, получаемых по сети. Данные представляют собой пакеты некоторого протокола (в данном случае речь идет про протокол NetFlow хотя это и не принципиально). Протокол имеет несколько версий, что сказывается на структуре и содержимом пакетов. Достоверно известно, что в любой версии первые 2 байта пакета означают номер версии протокола. Необходимо сделать обертку для этих данных — т.е. прилетает пакет, мы его разбираем на части, и засовываем в какой-то класс.
Вот как собственно сделать это наиболее удобным образом? чтобы и выглядело прилично, и было расширяемо нормально (в случае появления новых версий).
Я пока думаю сделать так: завести отдельные классы для каждой версии, базовый класс (Foo) для них и в нем статический метод. Этот метод будет возвращать объект с типом Foo принимая входной массив байт. Соответственно, будет определять версию пакета и создавать объект нужного типа, инициализируя его всеми необходимыми данными. Если это как то вписывается в существующие паттерны, то как это можно назвать? Мне думалось, что это фабрика, но как-то не очень похоже на фабрику...
Соответственно для конечной программы обработка пакета представляет собой что-то типа:
byte [] packetData;
// Здесь получаем содержимое пакета по сети
PacketVersion1 PV1 = null;
PacketVersion2 PV2 = null;
PacketBase Packet = PacketBase.Parse(packetData);
if(typeof(Packet) == typeof(PacketVersion1))
{
PV1 = (PacketVersion1)Packet;
}
if(typeof(Packet) == typeof(PacketVersion2))
{
PV2 = (PacketVersion2)Packet;
}
Все бы может и не плохо, но вот только в этом случае надо заводить еще некий флаг, для указания какую именно переменную использовать и каждый раз прежде чем что-то делать с этими данными проверять значение этого флага... Как-то слишком геморно и вообще некрасиво и даже неприлично, я бы сказал..
Нужен совет.
P.S. как напишу это хозяйство — выложу исходники для всех желающих на условиях Absolutely Free, мож кому пригодится....