CSharp:Design Pattern Factory Method
From Aino Wiki
Descrizione
La Gand of Four (La banda dei quattro) descrivono il Factory pattern come un metodo per definire interfacce necessarie alla creazione di oggetti lasciando alle sottoclassi l'onere di decidere quale tipo di classe va instanziata. Si lascia che una classe sia instanziata da una sottoclasse, praticamente si applica ai casi in cui il tipo di oggetto restituito lo decide il metodo chiamato in funzione di una logica incapsulata nel metodo stesso.
Codice di esempio
Riporto il diagramma delle classi del pattern come presentato nel video corso della piattaforma Lynda.com (di LinkedIn):
In cosa consiste l'esempio:
- si definisce una classe astratta "ISavingsAccount" in cui si definisce una proprietà comune a tutte le classi che erediteranno da essa.
- Due classi concrete derivanti dalla classe di prima
- Una classe con un metodo concreto che eredita dall'interfaccia "ICreditUnionFactory" (il cui scopo è creare una struttura comune a tutte le classi che ne ereditano).
- Il metodo concreto restituirà un oggetto differente in base al contenuto del parametro in input, ciò è lo scopo del Pattern
- porre attenzione al fatto che il metodo di prima è una funzione il cui tipo in uscita è la classe astratta la classe\oggetto reale in uscita è del tipo derivato dalla classe astratta.
namespace Es_FactoryMethod { // Product public abstract class ISavingsAccount { public decimal Balance { get; set; } } // Concrete Product public class CitiSavingsAcct : ISavingsAccount { public CitiSavingsAcct() { Balance = 5000; } } // Concrete Product public class NationalSavingsAcct : ISavingsAccount { public NationalSavingsAcct() { Balance = 2000; } } // Creator // Questa interfaccia serve ad imporre delle regole comuni a tutte le classi derivate // a differenza dell'astrazione però non ha alcuna implementazione di funzionalità interface ICreditUnionFactory { ISavingsAccount GetSavingsAccount(string acctNo); } // Concrete Creators // Questa classe restituirà un oggetto differente in base al contenuto del parametro in input public class SavingsAcctFactory : ICreditUnionFactory { public ISavingsAccount GetSavingsAccount(string acctNo) { if (acctNo.Contains("CITI")) { return new CitiSavingsAcct(); } else if (acctNo.Contains("NATIONAL")) { return new NationalSavingsAcct(); } else throw new ArgumentException("Invalid Account Number"); } } }
Mappa e Link
C# | Design Pattern | Teoria
Parole chiave: