Non capisco la tua domanda. E penso che ci siano dei malintesi:
I) Un fabbrica è un modello di progettazione utilizzato per separare la creazione dell'oggetto dal consumo dell'oggetto . Ci sono due modi possibili per affrontarlo:
1) Delega la creazione dell'istanza a un oggetto separato
2) Per creare istanze viene utilizzato un metodo statico
Il vantaggio: le dipendenze non vengono più create. L'oggetto che ha bisogno chiede per le sue dipendenze. Le fabbriche consentono l'iniezione di dipendenza . Ma invece di gestire una dozzina di fabbriche e tutto il cablaggio, lo lasci per un'astrazione chiamata (DI-) container .
II) Un'interfaccia è il modo C # / Java di gestire l'ereditarietà multipla. Invece di lasciare che l'oggetto erediti le implementazioni da più oggetti, puoi solo ereditare un'API, per così dire. Un'interfaccia è un contratto che definisce un'API e lascia l'implementazione all'oggetto. Gli oggetti definiscono famiglie di oggetti in qualche modo correlati tramite una relazione is-a , si potrebbe dire, le interfacce definiscono una relazione di oggetti diversi che condividono comportamento comune .
Che cosa significa per (I) ?
Se hai una fabbrica per oggetti diversi che seguono la stessa API , il tipo di ritorno della fabbrica è l'interfaccia comune ( pensa a ILogging con FileLogger , DatabaseLogger , EventlogLogger e così via).
L'oggetto consumatore riceve solo qualcosa che si comporta come un Logger . Non ha bisogno di sapere quale tipo di registratore sta usando - anche se è NullLogger .
III) Un Proxy potrebbe essere qualsiasi oggetto che imita un altro oggetto. Un caso comune è oggetti fittizi . Si avvolge una funzionalità con un'altra.
Quale vuoi implementare dipende dalla tua intenzione:
-
Se stai progettando un oggetto che ha bisogno in qualche modo di utilizzare un'API comune per HttpStackExchangeClient
e UdpStackExchangeClient
lo si implementerà tramite IStackExchangeClient e un fabbrica
-
Diciamo HttpStackExchangeClient
e UdpStackExchangeClient
hanno un'API diversa e vuoi che si comporti come l'altro, useresti un proxy che racchiude l'altro.
-
Se hai IStackExchangeClient come interfaccia e HttpStackExchangeClient
e UdpStackExchangeClient
lo implementano, usare un proxy non ha senso, poiché l'oggetto consumatore non sa quale sta per usare.
I've thought hard about it and I can't choose between one style or the other, but clearly some parts of the .NET framework use factories, and some parts don't, even when there are multiple underlying implementations of its interface.
Nota che il framework ha una cronologia e non è stato sempre progettato a fondo (punterei), il che potrebbe essere il motivo di alcune incongruenze.