Domanda Perché esistono metodi di creazione statici?


Mi stavo chiedendo, perché statico Create esistono metodi?

Ad esempio, perché usare questo codice:

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);

su questo codice:

System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);

Non riesco a trovare le motivazioni per l'utilizzo l'uno sull'altro e non riesco a trovare alcuna relazione tra le classi che usano questo costrutto sull'altro.

Qualcuno può far luce su questo?


14
2018-03-18 13:55


origine


risposte:


XmlReader è una classe astratta. Non puoi istanziarlo.

Fornire a Create metodo è un'istanza del modello factory. A seconda degli argomenti specificati, viene scelta e restituita una diversa implementazione di XmlReader. Ad esempio, esistono implementazioni XmlReader convalidanti e non valide nel framework .NET.


17
2018-03-18 13:57



Una risposta più generale ...

La ragione per cui alla gente piacciono questi tipi di metodi, noti come "metodi statici di fabbrica", è perché puoi dare loro un nome (al contrario dei costruttori). Quindi, se hai bisogno di tre diversi costruttori, puoi invece creare metodi di factory static che hanno nomi rilevanti per il loro uso.

Un altro motivo è che un metodo factory non ha realmente bisogno di creare nuovi oggetti - può restituire lo stesso più e più volte se necessario.


6
2018-03-18 14:02



Perché in realtà può creare e oggetto di tipo derivato a cui non hai accesso o restituire una classe astratta (come risposta a dtb). Questo è modello di metodo di fabbrica.


5
2018-03-18 13:57



Un costruttore può essere utilizzato solo per creare istanze di una classe specifica, mentre una statica Create il metodo può creare un'istanza di classi diverse a seconda dell'input.

Nel caso del XmlReader classe il Create il metodo restituirà un XmlDictionaryReader, XmlTextReader, XmlValidatingReader o XmlNodeReader, a seconda del sovraccarico che usi e dei parametri che gli vengono inviati.


4
2018-03-18 14:03



Questo modello consente il XmlReader class per fornire istanze di classi derivate su misura per i parametri passati Create. Nota in particolare i sovraccarichi che accettano un XmlReaderSettings oggetto. Un diverso XmlReader sottoclasse può essere restituita a seconda delle impostazioni.

Un esempio migliore è WebRequest.Create(url). A seconda dell'URL che passi, potresti ricevere un HttpWebRequest, un FtpWebRequest, eccetera.


3
2018-03-18 13:59



  • Perché non devi impegnarti per la classe esatta di oggetti che ottieni. I costruttori possono solo costruire oggetti esattamente da una classe.
  • Perché puoi dare al metodo un nome significativo, ad es. BigInt.probablePrime (). I costruttori possono avere solo lo stesso nome della classe.
  • Poiché puoi avere più di un metodo factory per la stessa combinazione di tipi di parametro, ad es. Point.fromPolarCoords (int, int) e Point.fromCartesianCoords (int, int), ma può esistere solo un punto di costruzione (int, int).

(Una risposta molto più dettagliata è fornita in "Effective Java" di Bloch).


3
2018-03-18 14:01



A volte esistono come una forma di auto-documentazione. Ho un componente di accesso db che posso istanziare con una stringa di connessione o il nome della connessione nel file di configurazione. Entrambi questi metodi accettano stringhe come parametro in modo che non possano essere differenziati solo dagli argomenti. Così ho creato un FromConnectionString(string)metodo di fabbrica e a FromConnectionName(string) metodo di fabbrica. Questa sfumatura sarebbe interamente persa da un new Foo(bool, string) linea.


1
2018-03-18 14:02