Я не очень хорошо знаком с этими форматами, но я бы создал простой объект передачи данных, который представляет ваш общий объект событий календаря. Он ничего не делает, но держит данные (псевдокод):
class CalendarEvent
{
DateTime Date { get; }
string Title { get; }
string Description { get; }
}
Затем вы создаете интерфейс для CalendarEventReader и CalendarEventWriter (это стратегия шаблон и, возможно, в Builder шаблон, вид):
interface ICalendarEventReader
{
CalendarEvent Read(Stream data);
// Add additional methods if needed e.g.:
string GetTitleOnly(Stream data);
}
interface ICalendarEventWriter
{
Stream Write(CalendarEvent event);
// Add additional methods if needed e.g.:
Stream WriteSummaryOnly(CalendarEvent event);
}
После этого фактические реализации реализуют вышеуказанные интерфейсы. Один для каждого формата. Вы можете даже думать о том, читатель и писатель в одном классе:
class CalDavConverter : ICalenderEventWriter, ICalendarEventReader
{
...
}
Вы бы тогда иметь Repository (это Factory модель может быть с Singleton), который поддерживает список реализаций/Writer ICalenderEventReader для различных форматов:
static class CalenderEventConverterRepository
{
static ICalendarEventReader GetReader(string formatName /*or any other data upon wich to decide wich format is needed*/)
{
...
}
static ICalendarEventReader GetWriter(string formatName /*or any other data upon wich to decide wich format is needed*/)
{
...
}
}
Я не думаю, что интерфейсы считывающего устройства можно назвать строителем. Но кроме этого +1 для хорошего дизайнерского внушения. – Tanmay
Решение, которое я придумал самостоятельно, было аналогичным (минус заводская часть). Как выглядит код клиента? Будет ли объект календаря использовать эту фабрику или использовать код клиента? –