SUPERCAT.DEV

Benvenut* sul mio blog

CSHARP

Design pattern: factory

15-01-2023

Piccolo recap sui DP

Uno dei pattern che uso di più ultimamente. Se ho bisogno di un nuovo prodotto non devo più andare a toccare le classi già create ma mi basta aggiungere un nuovo produttore e prodotto.

using System;

namespace FactoryDP
{
    abstract class Produttore
    {
        public abstract IProdotto Prepara();

        public string Fai()
        {
            return "Produttore: " + Prepara().ChiSono();
        }
    }

    class Panetteria : Produttore
    {
        public override IProdotto Prepara()
        {
            return new Pagnotta();
        }
    }

    class Pasticceria : Produttore
    {
        public override IProdotto Prepara()
        {
            return new Croissant();
        }
    }

    // Se vogli aggiungere un altro
    class Pastificio : Produttore
    {
        public override IProdotto Prepara()
        {
            // aggiungo un nuovo prodotto
            return new Spaghetto();
        }
    }

    public interface IProdotto
    {
        string ChiSono();
    }

    class Pagnotta : IProdotto
    {
        public string ChiSono()
        {
            return "Ecco una pagnotta";
        }
    }

    class Croissant : IProdotto
    {
        public string ChiSono()
        {
            return "Ecco un croissant";
        }
    }

    // Aggiungo il prodotto
    class Spaghetto : IProdotto
    {
        public string ChiSono()
        {
            return "Ecco uno spaghetto";
        }
    }

    class Cliente
    {
        public void Main()
        {
            Console.WriteLine("Cliente: Voglio un prodotto di panetteria\n" + new Panetteria().Fai());
            
            Console.WriteLine("---");
            Console.WriteLine("Cliente: Voglio un prodotto di pasticceria\n" + new Pasticceria().Fai());
            
            Console.WriteLine("---");
            Console.WriteLine("Cliente: Voglio un prodotto di pastificio\n" + new Pastificio().Fai());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new Cliente().Main();
        }
    }
}