UGIdotNET Home UGIdotNET Home
UGIdotNET Blogs UGIdotNET Blogs
UGIdotNET Forum UGIdotNET Forum
MSDN Architetti MSDN Architetti
Visualizza Modifiche Visualizza Modifiche
Modifica Modifica
Stampa Stampa
Modifiche Recenti Modifiche Recenti
Sottoscrizioni Sottoscrizioni
Ufficio Oggetti Smarriti Ufficio Oggetti Smarriti
Cerca Riferimenti Cerca Riferimenti
Rinomina Rinomina
Cerca

Versioni

07/02/2008 17.27.13
212.189.140.13
08/03/2007 18.39.16
88.149.168.230
07/03/2007 23.18.09
88.149.168.230
07/03/2007 16.54.14
-87.25.139.114
07/03/2007 16.52.46
-87.25.139.114
Elenco completo versioni Elenco completo versioni
Pattern Factorymethod
.
Summary un design pattern che separa la responsabilità di istanziare una classe dalla responsabilità di scegliere quale classe istanziare.

Intento

Il design pattern Factory Method definisce un'interfaccia (Creator) per ottenere una nuova istanza di un oggetto (Product) delegando ad una classe derivata (ConcreteCreator) la scelta di quale classe istanziare (ConcreteProduct).

La classe ConcreteCreator che determina quale classe ConcreteProduct istanziare è stabilita a design-time attraverso l'ereditarietà quindi questo design pattern è classificato rispetto allo scopo (vedi ClassificazioneDeiDesignPattern#ClassiOggetti) come rivolto alle classi. Rispetto al fine questo questo design pattern è classificato tra i ClassificazioneDeiDesignPattern#Creazionali

Diagramma UML

Un'altro diagramma equivalente qui .

Motivazione

Un componente od un framework può aver bisogno di delegare al programmatore che lo utilizza la scelta di quale classe istanziare. Ad esempio

  • si può lasciare al programmatore la scelta di quale classe istanziare tra quelle di una lista predefinita di classi del framework (configurazione)
  • si può lasciare al programmatore la scelta di istanziare una classe del framework di default o una nuova classe da derivata da quella di default e personalizzata dal programmatore stesso (personalizzazione)
  • si può lasciare al programmatore la scelta di istanziare una nuova classe da lui realizzata (estensione).

Questa necessità è assolta dal design pattern Factory Method, invece di richiamare direttamente il costruttore della classe da istanziare il design pattern Factory

Esempi d'uso in .NET

Uno dei Factory Method più usato in .NET è sicuramente il metodo GetEnumerator() dell'interfaccia IEnumerable che viene utilizzata dal framework quando il programmatore scrive un foreach su una collezione oppure quando il programmatore definisce la sua versione di IEnumerable quando implementa una nuova collezione.

Un'altro esempio anche se di uso meno frequente è il metodo Create() della classe System.Net.WebRequest che in base al URI passato sceglie se istanziare la classe HttpWebRequest, FileWebRequest oppure FtpWebRequest.

Un altro esempio che sarà d'uso comune in .NET 2.0 è il metodo GetFactory(providerInvariantName) della classe DbProviderFactories che a seconda del providerInvariantName indicato restituirà la corrispondente classe (ad esempio OdbcFactory, OleDbFactory, OracleClientFactory, SqlClientFactory).

Note sulla implementazione in .NET

Una convenzione di denominazione usata in alcune parti del .NET Framework per questo desin pattern consiste nel accodare Factory al nome della interfaccia che ha il ruolo di Creator (come per IIdentityPermissionFactory) e usare il prefisso Create al nome del metodo (come per CreateIdentityPermission).

Del codice .NET di esempio è disponibile qui .

Relazione con altri design pattern

Vedi la mappa della RelazioneTraDesignPattern.

Approfondimenti

Invece di usare una RelazioneDiEreditarietà per implementare ConcreteCreator derivandolo da Creator è possibile usare i Generics del C# 2.0 applicando il ParadigmaDiProgrammazioneGenerica per creare una versione generica di Creator che accetta il tipo ConcreteProduct come parametro.

Domande di approfondimento

  • In che modo il design pattern Factory Method promuove il basso accoppiamento?
  • Che differenza c'è con il PatternAbstractFactory?
  • Oltre a ridurre l'accoppiamento quali altri usi ha questo pattern?

Link

http://c2.com/cgi/wiki?FactoryMethodPattern

VediAnche CatalogoDeiDesignPattern, DesignPattern#PatternComuni

UGIdotNETWiki

UGIdotNETWiki è il WikiWiki italiano dedicato a .NET

Se è la prima volta che senti parlare di Wiki, leggi il BenvenutoAiVisitatori e WikiInUnMinuto, oppure il ManualePassoPassoDelWiki.

Argomenti Recenti

  • PatternFactorymethod
© 2008 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali