|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2008
Messaggi: 485
|
[C#] Abstract factory pattern espandibile
Ciao,
mi ritrovo con un piccolo problema nel progetto che sto attualmente sviluppando e volevo cheidere un vostro parere. Il software opera su alcuni dati che legge/salva su file mediante opportune classi fileReader/fileWriter derivate da una classe astratta. Poichè in futuro si potrebbe decidere di salvare i dati in modalità/formati diversi ho pensato di implementare una abstract factory che in base all'estensione del file restituisce l'istanza della classe associata a quel formato (per esempio txtFileReader, XmlFileReader). Vorrei però evitare un approccio "hard-coded" con un lungo switch, anche perchè parte del progetto sarà esportato sottoforma di dll e vorrei dare la possibilità di espandere l'abstract factory anche a chi non possiede il sorgente, ma che potrebbe implementare dei propri reader/writer. Ho pensato di creare una classe AbstractFactory, statica, contenente due dizionari <string, type> che diano le associazioni estensione -> classe: Codice:
public static class DataFileFactory
{
public static Dictionary<string,Type> ReaderAssociation = new Dictionary<string,Type>();
public static Dictionary<string,Type> WriterAssociation = new Dictionary<string,Type>();
public static DataFileReader GetReader(string filename)
{
string fileExtension = System.IO.Path.GetExtension(filename).TrimStart('.').ToLowerInvariant();
ConstructorInfo constructor = DataFileFactory.ReaderAssociation[fileExtension].GetConstructor(new Type[] {typeof(string)});
return (DataFileReader)constructor.Invoke(new object[] {filename});
}
public static DataFileWriter GetWriter(string filename)
{
string fileExtension = System.IO.Path.GetExtension(filename).TrimStart('.').ToLowerInvariant();
ConstructorInfo constructor = DataFileFactory.WriterAssociation[fileExtension].GetConstructor(new Type[] {typeof(string)})
return (DataFileWriter)constructor.Invoke(new object[] {filename});
}
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:33.



















