C# -  Simple Factory: Exemplo


Hoje veremos um exemplo de aplicação do padrão Factory conhecido como Simple Factory implementado na linguagem C#.

Embora seja uma Factory o Simple Factory não esta catalogado dentre os padrões de projetos criacionais do famoso livro da Gang of four.

O padrão Simple Factory é a classe mais simples que possui métodos para a criação de outras instâncias de classe. Por exemplo, se você precisa criar muitas de instâncias de uma classe específica, é muito mais fácil usar um método que retorna instâncias para você. Essa é a ideia principal do Simple Factory.

O Simple Factory é útil quando você não sabe qual tipo de objeto será usado e então você cria uma fábrica para gerenciar isso para você. Nesta classe você cria um método, que pode ser estático ou não,  que vai retornar o o objeto do tipo correto de acordo com um critério definido.

Para ilustrar a sua utilização vamos definir um cenário onde precisamos montar e/ou imprimir livros. Para isso vamos criar um projeto Console do tipo NET 5.0 usando o Visual Studio 2019.

Vamos iniciar definindo uma interface (poderia ser uma classe abstrata) para representar o tipo Livro:  

using System;

namespace SimpleFactory
{
    public interface ILivro
    {
        string Autor { get; set; }
        string Titulo { get; set; }
        int Paginas { get; set; }
        DateTime Lancamento { get; set; }
    }
}

A seguir vamos criar a classe concreta Livro que vai implementar a interface ILivro:   

using System;

namespace SimpleFactory1
{
    public class Livro : ILivro
    {
        public string Titulo { get; set; }
        public string Autor { get; set; }
        public int Paginas { get; set; }
        public DateTime Lancamento { get; set; }

        public Livro(string titulo, string autor, int paginas, DateTime lancamento)
        {
            Titulo = titulo;
            Autor = autor;
            Paginas = paginas;
            Lancamento = lancamento;
        }

        public override string ToString()
        {
            return $"{Autor} {Titulo} {Paginas} {Lancamento}";
        }

    }
}

Agora vamos criar a Factory onde vamos definir um método estático que vai retornar um objeto de um tipo conforme um critério definido:

using System;

namespace SimpleFactory1
{
    public class LivroFactory
    {
        public static ILivro CriaLivro(string titulo, string autor, int paginas, DateTime lancamento)
        {
            return new Livro(titulo, autor, paginas, lancamento);
        }
    }
}

Na Factory criada estamos retornando um instância da nossa interface ILivro por meio do  método  CriaLivro().

Agora vamos usar a Factory definindo o código a seguir no método Main da classe Program:

using System;
using static System.Console;

namespace SimpleFactory1
{
    class Program
    {
        static void Main(string[] args)
        {
           var livro = LivroFactory.CriaLivro("C# - Básico", "James King", 323, DateTime.Now);

           WriteLine("Titulo: " + livro.Titulo);
           WriteLine("Autor: " + livro.Autor);
           WriteLine("Paginas : " + livro.Paginas);
           WriteLine("Data de Lançamento: " + livro.Lancamento);

          

           WriteLine("Objeto Livro: " + livro.ToString());
           ReadLine();
        }
    }
}

Resultado:

Sem usar o padrão Simple Factory , ou seja usando uma classe normal, teríamos que chamar diretamente uma nova instância de Livro:

Livro livro = new Livro("C# - Básico", "James King", 323, DateTime.Now);

Usando a nossa classe LivroFactory abstraímos o processo de criação da classe Livro.

Observe na saída, a chamada do método livro.ToString() mostra que a herança funcionou conforme o esperado, então estamos obtendo um objeto Livro como queríamos, mesmo que não haja conhecimento direto (ou referência a) dele em nosso código de inicialização:

Este é um exemplo básico do padrão Simple Factory. Poderíamos ainda adicionar novos tipos de livro e executar alguma lógica básica no método CriaLivro() para garantir que a classe de tipo de livro adequada seja gerada e retornada, mas não importa o que aconteça, nosso código de inicialização por meio da classe LivroFactory não sabe ou se preocupa com como isso funciona.

Pegue o projeto aqui :  SimpleFactory.zip

E estamos conversados...

"Bom é ter esperança, e aguardar em silêncio a salvação do Senhor."
Lamentações 3:26

Referências:


José Carlos Macoratti