; Wzorzec fabryka C# (fabric pattern)

Wzorzec fabryka C# (fabric pattern)

Ostatnia rewizja: 2018-11-19 | Kategoria: C# - wzorce projektowe

Wzorzec fabryki należy do wzorców kreacyjnych - pomaga w zniesieniu odpowiedzialności z klienta z tworzenia odpowiedniej instancji, odpowiedzialność przenoszona jest na przygotowaną do tego fabrykę.

Przykład fabryki

Zajmiemy się bardzo prostym przypadkiem - zapisywaniem logów z działania aplikacji. Logi moga być zapisywane w różnych lokalizacjach, np w bazie danych bądź plikach.

public class Log
{
    public string Message { get; set; }
    public DateTime OcuuredAt { get; set; }
}

Musimy także w jakiś sposób określać gdzie chcemy zapisać logi.

public enum ELogDestinationType
{
    File,
    DB
}

Interfejs wymagający implementację metody SaveLog oraz klasy go implementujące.

public interface ILogWriter
{
    void SaveLog(Log logToSave);
}

public class FileLogger : ILogWriter
{
    public void SaveLog(Log logToSave)
    {
        Console.WriteLine("Zapisywanie logu do pliku");
    }
}

public class DatabaseLogger : ILogWriter
{
    public void SaveLog(Log logToSave)
    {
        Console.WriteLine("Zapisywanie logu do bazy danych");
    }
}

A teraz najważniejsze: fabryka

public class LogWriterFactory
{
    public ILogWriter CreateLogWriter(ELogDestinationType destinationType)
    {
        ILogWriter logWriter = null;
        switch (destinationType)
        {
            case ELogDestinationType.File:
                logWriter = new FileLogger();
                break;
            case ELogDestinationType.DB:
                logWriter = new DatabaseLogger();
                break;
            default:
                break;
        }
        return logWriter;
    }
}

oraz klasa odpowiedzialna za wywołanie metody fabrykującej

public class LogWriterProcessor
{
    ILogWriter logWriter;
    public void SaveLog(ELogDestinationType destinationType, Log logToSave)
    {
        LogWriterFactory logFactory = new LogWriterFactory();
        logWriter = logFactory.CreateLogWriter(destinationType);
        logWriter.SaveLog(logToSave);
    }
}

Wykorzystanie wzorca fabryki:

static void Main(string[] args)
{
    LogWriterProcessor logWriterProcessor = new LogWriterProcessor();
    var log = new Log()
    {
        Message = "Start programu",
        OcuuredAt = DateTime.Now
    };
    logWriterProcessor.SaveLog(ELogDestinationType.DB, log);
    logWriterProcessor.SaveLog(ELogDestinationType.File, log);
    Console.ReadKey();
}