Menu
CoddyTech

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 criacional 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 factory 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)
    {
        switch (type)
        {
            case "pdf":
                return new PdfDocument();
            case "word":
                return new WordDocument();
            default:
                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 mudanças apenas na fábrica, 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 diferentes tipos de notificação diretamente 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 a INotification apropriada com base na string de tipo:
    • "email" retorna uma EmailNotification
    • "sms" retorna uma SmsNotification
    • "push" retorna uma PushNotification
    Para qualquer tipo não reconhecido, retorne uma 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 lida com 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 o 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 solicita à factory o que precisa. Se você adicionar posteriormente uma SlackNotification, precisará atualizar apenas a factory, 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