Qual è il pattern factory di DRY-est per istanziare sottotipi basati su uno dei valori delle loro proprietà?

1

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?

    
posta Eric Eskildsen 15.02.2016 - 14:38
fonte

1 risposta

6

Sembra che tu stia combinando una fabbrica con un localizzatore di servizi.

In ogni caso, puoi costruire un Dictionary<string,Type> invece della serie di tipi e interrogarli per quale Url rispondono. Questo è ancora più flessibile, perché in questo modo puoi consentire alla tua applicazione di registrare nuovi client in fase di runtime, se ciò dovesse rendersi necessario.

    
risposta data 15.02.2016 - 14:49
fonte

Leggi altre domande sui tag