Menu
Coddy logo textTech

Padrão Factory

Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy. Lição 53 de 70.

O padrão Factory é um padrão de criação que delega a criação de objetos a um método ou classe separado. Em vez de usar new diretamente no seu código, você solicita a uma fábrica que crie objetos para você. Isso centraliza a lógica de criação e torna seu código mais flexível.

Considere um cenário em que você precisa criar diferentes tipos de documentos. Sem uma fábrica, seu código fica fortemente acoplado a classes específicas:

// Sem Factory - lógica de criação espalhada
IDocument doc;
if (type == "pdf")
    doc = new PdfDocument();
else if (type == "word")
    doc = new WordDocument();

Uma fábrica encapsula essa tomada de decisão em um só lugar:

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)
    {
        return type switch
        {
            "pdf" => new PdfDocument(),
            "word" => new WordDocument(),
            _ => throw new ArgumentException("Unknown type")
        };
    }
}

Agora, o código do cliente simplesmente solicita o que precisa sem conhecer as classes concretas:

var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open();  // Abrindo PDF

O padrão Factory se destaca quando você precisa adicionar novos tipos posteriormente. Adicionar um SpreadsheetDocument exige alterações apenas na factory, e não em todos os lugares onde os documentos são criados. Essa separação torna sua base de código mais fácil de manter e testar.

challenge icon

Desafio

Fácil

Vamos criar um sistema de notificações usando o padrão Factory. Em vez de criar diretamente diferentes tipos de notificações em todo o seu código, você centralizará a lógica de criação em uma classe factory que decide qual notificação criar com base em um identificador de string simples.

Você organizará seu código em três arquivos:

  • Notification.cs: Defina uma interface INotification no namespace Notifications com um único método Send(string message) que retorna uma string. Em seguida, crie três classes que implementam essa interface:
    • EmailNotification - retorna "Email: {message}"
    • SmsNotification - retorna "SMS: {message}"
    • PushNotification - retorna "Push: {message}"
  • NotificationFactory.cs: Crie uma classe NotificationFactory no mesmo namespace com um método Create(string type) que retorna o INotification apropriado com base na string de tipo:
    • "email" retorna um EmailNotification
    • "sms" retorna um SmsNotification
    • "push" retorna um PushNotification
    Para qualquer tipo não reconhecido, retorne um EmailNotification como padrão.
  • Program.cs: Reúna tudo criando uma instância da factory e usando-a para criar notificações com base na entrada. A factory cuida de toda a decisão sobre qual classe concreta instanciar.

Você receberá duas entradas:

  • O tipo de notificação (por exemplo, sms)
  • A mensagem a ser enviada (por exemplo, Your order has shipped)

Use sua factory para criar o tipo de notificação apropriado, depois chame seu método Send com a mensagem e imprima o resultado.

Por exemplo, se as entradas forem push e Meeting in 5 minutes, a saída deverá ser:

Push: Meeting in 5 minutes

Observe como seu código principal nunca usa new EmailNotification() ou algo semelhante — ele simplesmente pede à factory o que precisa. Se posteriormente você adicionar uma SlackNotification, precisará atualizar apenas a factory, e não todos os lugares que criam notificações!

Experimente você mesmo

using System;
using Notifications;

class Program
{
    public static void Main(string[] args)
    {
        // Ler entrada
        string type = Console.ReadLine();
        string message = Console.ReadLine();

        // TODO: Crie uma instância de NotificationFactory

        // TODO: Use a factory para criar a notificação apropriada

        // TODO: Chame o método Send e imprima o resultado
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C# online