Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

CSharp:Design Pattern Abstract Factory

From Aino Wiki

Jump to: navigation, search

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.

Pattern AbstracFactory Diagramma01.png

Concretamente, il diagramma delle classi che segue corrisponde all'implementazione proposta nella solution di cui esporrò progetti, classi, interfacce e metodi

Pattern AbstracFactory Diagramma02.png


Questa solution si compone di 5 progetti come da immagine:

Pattern AbstracFactory DotNetSolution.png

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


Visual Studio


Parole chiave:

Author Giuseppe AINO