Я бы пошел с фабричным рисунком.Похоже, вы можете использовать наследование / полиморфизм с дженериками.Вы даже можете сделать внедрение зависимостей, если будете использовать аналогичный дизайн следующим образом.
public interface IDocument
{
void Save();
}
public class Document : IDocument
{
}
public class PdfDocument: IDocument
{
public void Save(){//...}
}
public class TxtDocument: IDocument
{
public void Save(){//...}
}
public class HtmlDocument : IDocument
{
public void Save(){//...}
}
, тогда в другом классе вы можете сделать это:
public void SaveDocument(T document) where T : IDocument
{
document.save();
}