Segui la seguente gerarchia di classi:
-
%codice%
-
Client
-
FacebookClient
-
PinterestClient
-
Ogni client deve definire un valore per una proprietà enum denominata TwitterClient
(proprietà stringa ClientType
nella versione originale di questa domanda, quindi la risposta accettata). Url
dovrebbe quindi essere in grado di creare un'istanza per tipo di client.
ClientFactory.Create(ClientType.Facebook);
ClientFactory
potrebbe essere una proprietà statica per ogni sottotipo, e quindi i sottotipi potrebbero essere selezionati in base al suo valore in fabbrica:
// Create array of possible client subtypes
Type[] clients = new[] { typeof(FacebookClient), typeof(PinterestClient), typeof(TwitterClient) };
// Select subtype with URL that matches one passed to factory
Type client = clients.SingleOrDefault(c => clientType == (Client)c.GetProperty("ClientType").GetValue(null));
return (Client)Activator.CreateInstance(client, parameters);
Tuttavia, poiché i membri statici non possono essere astratti, non sono sicuro di garantire che ClientType
sia impostato, e ci sono dozzine di sottotipi.
C'è un modo per forzare ClientType
ad essere impostato? Un altro modo per farlo (ad esempio, un'istruzione ClientType
) potrebbe essere un'opzione migliore?