Ciao a tutti
Oggi continuerò a bloggare sui pattern che ormai sono diventati parte del bagaglio culturale di ogni analista programmatore
Il Factory Method come l'Abstract Factory sono altri due pattern creazionali descritti dalla GoF (gang of four), per chi non lo sa, è il soprannome dato ai 4 autori del libro design pattern da loro scritto nel 1995, e che potrete trovare alla vostra destra tra i link ;)
Il concetto base dei due pattern è la creazione di un istanza di classe astraendone l'implementazione, per farlo si utilizza un'interfaccia che rappresenta il comportamento dell'oggetto, senza un implementazione reale. Il motivo alla base è quello di dare più flessibilità al codice creando dei comportamenti comuni (appunto un pattern di programmazione), oltre al fatto di sconnettere il codice dietro ad una implementazione, dal prototipo di utilizzo (appunto l'interfaccia), in scenari di distribuzione di dll, questo garantisce anche una minore diffusione del proprio codice, garantendo comunque un contratto d'uso (sempre l'interfaccia) per le nostre classi.
La differenza alla base dei due pattern sta in due punti:
1) Il Factory Method (alcuni lo chiamano anche Simple Factory) prevede un'interfaccia per n rappresentazioni reali che la implementano definendone altrettanti comportamenti. Il factory (il costruttore) in questo caso è un metodo appartenente all'interfaccia (es factoryMethod()) poi implementato da ogni classe in modo autonomo.
2) L'Abstract Factory prevede una famiglia di interfacce connesse tra di loro implementate da un unico costruttore (la fabbrica) per tutte, di solito singleton. In questo caso appunto il costruttore è una classe appositamente creata.
Esempio (Factory Method)
Abbiamo un interfaccia IPerson e due implementazioni Person e Children. Entrambe implementano l'interfaccia, ma solo Children ad esempio ha un metodo factory che richiede 2 IPerson da collegare come Mom e Dad, che potranno essere usate per ridefinire il .ToString() di Children con un output tipo "<Nome e Cognome>, figlio di <Mom> e <Dad>"
Esempio (Abstract Factory)
Uno degli esempi più utilizzati (anche per chi non conosce il pattern) è quello relativo alla famiglia di oggetti ADO.NET del namespace System.Data.Common: IDBConnection, IDBCommand, IDBxxxxxx in cui è stata resa astratta una famiglia interna di classi dalla connessione al command al datareader e via di seguito. Il factory poi, che è una classe costruttrice, prende in input il nome della famiglia di prodotto da create, es: "System.Data.SqlClient" (solitamente configurabile da .config).
Il factory, solitamente implementato a sua volta come singleton, avrà un metodo per creare ogni tipo di oggetto della famiglia a lui associato es:
DbProviderFactory factory = DbProviderFactory.GetFactory("System.Data.SqlClient");
factory.CreateConnection()
factory.CreateCommand()
factory.CreateDataAdapter()
Ovviamente, ogni famiglia diversa avrà un factory diverso.