CSharp:Design Pattern Abstract Factory
From Aino Wiki
Contents
Introduzione
Rappresenta una astrazione di alto livello, una fabbrica di fabbriche usando interfacce e classi astratte.
Questo pattern usa lo stesso pattern Factory Method ma l'astrazione che aggiunge ci consente di restituire in output classi che ereditano da una stessa classe padre così che abbiano alla fine una stessa struttura con Proprietà e Metodi comuni (questi a loro volta son definiti da interfacce sempre per lo scopo di definire chiaramente un aspetto che li accomuna).
In questo modo, grazie a questo pattern, si permette che un sistema sia indipendente dall'implementazione degli oggetti concreti e che il client, attraverso l'interfaccia, ne utilizzi diverse famiglie. Segue un esempio che ne descrive concretamente tutta la struttura concettuale.
Esempio
Tratto da un esercizio\esempio a corredo del video corso seguito su Lynda.com (di LinkedIn).
In modo generico, come accennato nell'introduzione, avremo due Classi, A e B che hanno la stessa struttura e che verranno restituite in output da una classe provider ad un metodo in base a quanto sarà presente nella particolare richiesta (Request) che, nell'esempio concreto mostrato, è nella stringa presa da un vettore di stringhe.
Concretamente, il diagramma delle classi che segue corrisponde all'implementazione proposta nella solution di cui esporrò progetti, classi, interfacce e metodi
Questa solution si compone di 5 progetti come da immagine:
Pogetto Interfaces, classe Common
namespace Interfaces { // Abstract Factory public abstract class ICreditUnionFactory { public abstract ISavingsAccount CreateSavingsAccount(); public abstract ILoanAccount CreateLoanAccount(); } // Abstract Product A public interface ILoanAccount { } // Abstract Product B public interface ISavingsAccount { } }
Progetto CitiCreditUnion, File CitiCreditUnionFactory.cs
namespace CitiCreditUnion { // Concrete ProductA1 public class CitiSavingsAccount : ISavingsAccount { public CitiSavingsAccount() { Console.WriteLine("Returned Citi Savings Account"); } } // Concrete ProductB1 public class CitiLoanAccount : ILoanAccount { public CitiLoanAccount() { Console.WriteLine("Returned Citi Loan Account"); } } // Concrete Factory 1 public class CitiCreditUnionFactory : ICreditUnionFactory { public override ILoanAccount CreateLoanAccount() { CitiLoanAccount obj = new CitiLoanAccount(); return obj; } public override ISavingsAccount CreateSavingsAccount() { CitiSavingsAccount obj = new CitiSavingsAccount(); return obj; } } }
Progetto NationalCreditUnion, file NationalCreditUnionFactory.cs
using Interfaces; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NationalCreditUnion { // ProductA2 public class NationalSavingsAccount : ISavingsAccount { public NationalSavingsAccount() { Console.WriteLine("Returned National Savings Account"); } } // ProductB2 public class NationalLoanAccount : ILoanAccount { public NationalLoanAccount() { Console.WriteLine("Returned National Loan Account"); } } // Concrete Factory 2 public class NationalCreditUnionFactory : ICreditUnionFactory { public override ILoanAccount CreateLoanAccount() { NationalLoanAccount obj = new NationalLoanAccount(); return obj; } public override ISavingsAccount CreateSavingsAccount() { NationalSavingsAccount obj = new NationalSavingsAccount(); return obj; } } }
Progetto Provider, file CreditUnionFactoryProvider.cs
namespace Providers { public class CreditUnionFactoryProvider { public static ICreditUnionFactory GetCreditUnionFactory(string accountNo) { if (accountNo.Contains("CITI")) { return new CitiCreditUnionFactory(); } else if (accountNo.Contains("NATIONAL")) { return new NationalCreditUnionFactory(); } else return null; } } }
Main, uso del Pattern Factory method
File Program.cs della console application.
namespace AbstractFactory { class Program { static void Main(string[] args) { List<string> accntNumbers = new List<string> { "CITI-456", "NATIONAL-987", "CHASE-222" }; for (int i = 0; i < accntNumbers.Count; i++) { ICreditUnionFactory anAbstractFactory = CreditUnionFactoryProvider.GetCreditUnionFactory (accntNumbers[i]); if (anAbstractFactory == null) { Console.WriteLine("Sorry. This credit union w/ account number" + " ' {0} ' is invalid.", (accntNumbers[i])); } else { ILoanAccount loan = anAbstractFactory.CreateLoanAccount(); ISavingsAccount savings = anAbstractFactory.CreateSavingsAccount(); } } Console.ReadLine(); } } }
Mappa e Links
C# | Design Pattern | Teoria
Parole chiave: