Pattern Factory
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 53 di 70.
Il pattern Factory è un pattern creazionale che delega la creazione degli oggetti a un metodo o a una classe separati. Invece di usare direttamente new nel codice, chiedi a una factory di creare gli oggetti per te. Questo centralizza la logica di creazione e rende il codice più flessibile.
Considera uno scenario in cui devi creare diversi tipi di documenti. Senza una factory, il tuo codice diventa strettamente accoppiato a classi specifiche:
// Senza Factory - logica di creazione sparsa
IDocument doc;
if (type == "pdf")
doc = new PdfDocument();
else if (type == "word")
doc = new WordDocument();Una factory racchiude questo processo decisionale in un unico posto:
public interface IDocument
{
void Open();
}
public class PdfDocument : IDocument
{
public void Open() => Console.WriteLine("Opening PDF");
}
public class WordDocument : IDocument
{
public void Open() => Console.WriteLine("Opening Word");
}
public class DocumentFactory
{
public IDocument Create(string type)
{
switch (type)
{
case "pdf":
return new PdfDocument();
case "word":
return new WordDocument();
default:
throw new ArgumentException("Unknown type");
}
}
}Ora il codice client richiede semplicemente ciò di cui ha bisogno senza conoscere le classi concrete:
var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open(); // Apertura del PDFIl pattern Factory è ideale quando devi aggiungere nuovi tipi in un secondo momento. Per aggiungere un SpreadsheetDocument è necessario modificare solo la factory, non tutti i punti in cui vengono creati i documenti. Questa separazione rende il tuo codice più facile da mantenere e testare.
Sfida
FacileCostruiamo un sistema di notifiche usando il pattern Factory. Invece di creare direttamente diversi tipi di notifiche in tutto il codice, centralizzerai la logica di creazione in una classe factory che decide quale notifica creare in base a un semplice identificatore stringa.
Organizzerai il codice in tre file:
Notification.cs: Definisci un'interfacciaINotificationnello spazio dei nomiNotificationscon un unico metodoSend(string message)che restituisce una stringa. Poi crea tre classi che implementano questa interfaccia:EmailNotification- restituisce"Email: {message}"SmsNotification- restituisce"SMS: {message}"PushNotification- restituisce"Push: {message}"
NotificationFactory.cs: Crea una classeNotificationFactorynello stesso spazio dei nomi, con un metodoCreate(string type)che restituisce laINotificationappropriata in base alla stringa type:"email"restituisce un'EmailNotification"sms"restituisce unaSmsNotification"push"restituisce unaPushNotification
EmailNotificationcome valore predefinito.Program.cs: Metti insieme tutti gli elementi creando un'istanza della factory e usandola per creare notifiche in base all'input. La factory gestisce tutte le decisioni su quale classe concreta istanziare.
Riceverai due input:
- Il tipo di notifica (ad es.,
sms) - Il messaggio da inviare (ad es.,
Your order has shipped)
Usa la factory per creare il tipo di notifica appropriato, poi chiama il suo metodo Send con il messaggio e stampa il risultato.
Ad esempio, se gli input sono push e Meeting in 5 minutes, l'output dovrebbe essere:
Push: Meeting in 5 minutesNota che il codice principale non usa mai new EmailNotification() o simili: chiede semplicemente alla factory ciò di cui ha bisogno. Se in seguito aggiungi una SlackNotification, dovrai aggiornare solo la factory, non tutti i punti in cui vengono create le notifiche!
Provalo tu
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// Leggi l'input
string type = Console.ReadLine();
string message = Console.ReadLine();
// TODO: Crea un'istanza di NotificationFactory
// TODO: Usa la factory per creare la notifica appropriata
// TODO: Chiama il metodo Send e stampa il risultato
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online