Ho un oggetto factory ChallengeManager
per generare istanze di un oggetto Challenge
per un gioco che sto costruendo. Ci sono molte sfide I costruttori per ciascuna derivazione di classe Challenge
sono diversi, tuttavia esiste un'interfaccia comune tra di loro, definita nella classe base.Modello di fabbrica per la creazione di molte classi derivate
Quando chiamo manager.CreateChallenge()
, restituisce un'istanza di Challenge
, che è uno dei tipi derivati.
Idealmente, mi piacerebbe mantenere il codice per la costruzione dell'oggetto all'interno della classe derivata stessa, in modo che tutto il codice relativo a quell'oggetto sia co-localizzato. Esempio:
class Challenge {}
class ChallengeA : Challenge {
public static Challenge MakeChallenge() {
return new ChallengeA();
}
}
class ChallengeB : Challenge {
public static Challenge MakeChallenge() {
return new ChallengeB();
}
}
Ora, il mio ChallengeManager.CreateChallenge()
chiamata ha solo bisogno di decidere la classe di chiamare MakeChallenge()
su. L'implementazione della costruzione è contenuta dalla classe stessa.
Utilizzando questo paradigma, ogni classe derivata deve definire un metodo statico MakeChallenge()
. Tuttavia, poiché il metodo è statico, non sono in grado di utilizzare un'interfaccia qui, richiedendola.
Non è un grosso problema, dal momento che posso facilmente ricordare di aggiungere la firma del metodo corretto a ciascuna classe derivata. Tuttavia, mi chiedo se ci sia un design più elegante che dovrei prendere in considerazione.
Fortemente attaccato al disegno che stai suggerendo: come identificheresti quale Classe istanziare in 'ChallengeManager.CreateChallenge()'? e; se conosci già la classe da istanziare, perché non puoi semplicemente istanziarla nel metodo 'CreateChallange'? – Abhinav
In questo caso, ciò che accadrà è un metodo CreateChallenge() molto lungo e non così gestibile come la scomposizione della costruzione nelle classi pertinenti. – gdbj
Il tuo design è il migliore in termini di design. Preferirei non mettere più metodi di fabbrica statici nelle classi concrete, però. Utilizzare i costruttori effettivi per tutto ciò che è la responsabilità propria delle classi e il processo decisionale e la costruzione delle dipendenze in 'CreateChallenge'. Se 'CreateChallenge' diventa troppo lungo per i tuoi gusti, estrai i metodi da esso per rendere più chiara l'intenzione. Se è davvero lungo, estrailo nella sua classe. YMMV – bstenzel