Questa domanda è tempestiva per me - stavo scrivendo quasi esattamente questo codice ieri. Sostituisci semplicemente "Animale" con tutto ciò che è rilevante nel mio progetto, anche se rimarrò con "Animale" per motivi di discussione qui. Invece di un'istruzione 'switch', avevo una serie un po 'più complessa di istruzioni' if ', che implicavano più del semplice confronto di una variabile con determinati valori fissi. Ma questo è un dettaglio. Un metodo di fabbrica statico sembrava un modo pulito per progettare le cose, dato che il progetto è emerso dal refactoring di precedenti casini di codice rapidi e sporchi.
Ho rifiutato questo disegno sulla base della classe base che aveva conoscenza della classe derivata. Se le classi LandAnimal e SeaAnimal sono piccole, pulite e semplici, possono trovarsi nello stesso file di origine. Ma ho grandi metodi disordinati per leggere file di testo non conformi a standard definiti ufficialmente: voglio la mia classe LandAnimal nel suo file sorgente.
Ciò porta alla dipendenza circolare dei file: LandAnimal è derivato da Animal, ma Animal deve già sapere che esistono LandAnimal, SeaAnimal e altre quindici classi. Ho tirato fuori il metodo factory, l'ho messo nel suo file (nella mia applicazione principale, non nella mia libreria Animals) Avere un metodo factory statico mi è sembrato carino e intelligente, ma mi sono reso conto che in realtà non risolveva alcun problema di progettazione.
Non ho idea di come questo si riferisca al linguaggio C # idiomatico, dato che cambio molte lingue, di solito ignoro modi di dire e convenzioni peculiari delle lingue e gli stack di sviluppo al di fuori del mio solito lavoro. Semmai il mio C # potrebbe sembrare "pitonico" se questo è significativo. Miro alla chiarezza generale.
Inoltre, non so se ci sarebbe un vantaggio nell'utilizzare il metodo factory statico nel caso di classi piccole e semplici che difficilmente potrebbero essere estese in lavori futuri - avere tutto in un file sorgente potrebbe essere bello in alcuni casi.