Je choisirais le modèle Factory. Il semble que vous puissiez utiliser l'héritage et le polymorphisme avec les génériques. Vous pouvez même faire de l'injection de dépendance si vous optez pour une conception similaire à la suivante.
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(){//...}
}
puis dans une autre classe, vous pouvez le faire :
public void SaveDocument(T document) where T : IDocument
{
document.save();
}