Factory Method: O que é e para que serve?

Padrões de Projeto de Software: Um Breve Resumo

Antes de mergulharmos no Factory Method, é importante entender o que são padrões de projeto. Eles são soluções reutilizáveis para problemas comuns que encontramos durante o desenvolvimento de software. A beleza desses padrões está na forma como eles tornam nosso código mais flexível, fácil de entender e de manter.

O Que é o Factory Method?

O Factory Method é um desses padrões. Ele nos fornece uma maneira de criar objetos sem especificar a classe exata do objeto que será criado. Como assim? Ele define uma interface para criar objetos em uma superclasse, mas permite que as subclasses alterem o tipo de objetos que serão criados.

Para que serve o Factory Method?

Flexibilidade

A principal finalidade do Factory Method é fornecer flexibilidade ao nosso código. Ele nos permite introduzir novas classes de produtos sem quebrar o código existente.

Isolamento de Código

O Factory Method também ajuda a isolar o código que cria objetos do código que os usa. Isso torna nosso código mais modular e fácil de manter.

Controle sobre o Processo de Criação

Outro benefício é que ele nos dá mais controle sobre o processo de criação. Podemos decidir o que, quando e como um novo objeto será criado.

Estrutura e Componentes do Factory Method

A estrutura do Factory Method é composta por quatro componentes principais:

  1. Produto: Esta é a interface dos objetos que o método fábrica cria.
  2. Criadores: Estes definem o método fábrica que retorna um objeto do tipo Produto.
  3. Produtos Concretos: Estes são implementações da interface do Produto.
  4. Criadores Concretos: Estes sobrescrevem o método fábrica para retornar uma instância de um Produto Concreto.

Cada um desses componentes desempenha um papel vital na aplicação do Factory Method.

Exemplo Prático do Factory Method

Para ilustrar melhor, vamos considerar um exemplo prático. Imagine que você está construindo um software para uma fábrica de móveis. Você tem diferentes tipos de móveis, como cadeiras, mesas e sofás. Cada tipo de móvel requer um processo de fabricação diferente. Aqui, você pode usar o Factory Method para criar objetos correspondentes a cada tipo de móvel. Assim, quando um cliente solicitar um tipo específico de móvel, o Factory Method apropriado será chamado para criar o móvel desejado.

Exemplo de implementação em C#

C#
using System;

// Produto: Interface dos objetos que o método fábrica cria
public interface IMovel
{
    void Fabricar();
}

// Produtos Concretos: Implementações da interface do Produto
public class Cadeira : IMovel
{
    public void Fabricar()
    {
        Console.WriteLine("Fabricando uma cadeira.");
    }
}

public class Mesa : IMovel
{
    public void Fabricar()
    {
        Console.WriteLine("Fabricando uma mesa.");
    }
}

public class Sofa : IMovel
{
    public void Fabricar()
    {
        Console.WriteLine("Fabricando um sofá.");
    }
}

// Criadores: Definem o método fábrica que retorna um objeto do tipo Produto
public abstract class FabricaDeMoveis
{
    public abstract IMovel CriarMovel();
}

// Criadores Concretos: Sobrescrevem o método fábrica para retornar uma instância de um Produto Concreto
public class FabricaDeCadeiras : FabricaDeMoveis
{
    public override IMovel CriarMovel()
    {
        return new Cadeira();
    }
}

public class FabricaDeMesas : FabricaDeMoveis
{
    public override IMovel CriarMovel()
    {
        return new Mesa();
    }
}

public class FabricaDeSofas : FabricaDeMoveis
{
    public override IMovel CriarMovel()
    {
        return new Sofa();
    }
}

// Exemplo de uso do Factory Method
public class Program
{
    public static void Main(string[] args)
    {
        // Criando uma fábrica de cadeiras
        FabricaDeMoveis fabricaDeCadeiras = new FabricaDeCadeiras();
        IMovel cadeira = fabricaDeCadeiras.CriarMovel();
        cadeira.Fabricar();  // Saída: "Fabricando uma cadeira."

        // Criando uma fábrica de mesas
        FabricaDeMoveis fabricaDeMesas = new FabricaDeMesas();
        IMovel mesa = fabricaDeMesas.CriarMovel();
        mesa.Fabricar();  // Saída: "Fabricando uma mesa."

        // Criando uma fábrica de sofás
        FabricaDeMoveis fabricaDeSofas = new FabricaDeSofas();
        IMovel sofa = fabricaDeSofas.CriarMovel();
        sofa.Fabricar();  // Saída: "Fabricando um sofá."

        Console.ReadLine();
    }
}

// Fonte: ChatGPT

Neste exemplo, temos a interface IMovel que define o contrato para os objetos de móveis. Em seguida, temos as classes concretas Cadeira, Mesa e Sofa, que implementam essa interface.

A classe abstrata FabricaDeMoveis é o criador abstrato que define o método fábrica CriarMovel(). As classes concretas FabricaDeCadeiras, FabricaDeMesas e FabricaDeSofas herdam dessa classe abstrata e implementam o método fábrica para retornar a instância correspondente do produto concreto.

Exemplo de implementação em Java

Java
// Produto: Interface dos objetos que o método fábrica cria
interface IMovel {
    void fabricar();
}

// Produtos Concretos: Implementações da interface do Produto
class Cadeira implements IMovel {
    public void fabricar() {
        System.out.println("Fabricando uma cadeira.");
    }
}

class Mesa implements IMovel {
    public void fabricar() {
        System.out.println("Fabricando uma mesa.");
    }
}

class Sofa implements IMovel {
    public void fabricar() {
        System.out.println("Fabricando um sofá.");
    }
}

// Criadores: Definem o método fábrica que retorna um objeto do tipo Produto
abstract class FabricaDeMoveis {
    public abstract IMovel criarMovel();
}

// Criadores Concretos: Sobrescrevem o método fábrica para retornar uma instância de um Produto Concreto
class FabricaDeCadeiras extends FabricaDeMoveis {
    public IMovel criarMovel() {
        return new Cadeira();
    }
}

class FabricaDeMesas extends FabricaDeMoveis {
    public IMovel criarMovel() {
        return new Mesa();
    }
}

class FabricaDeSofas extends FabricaDeMoveis {
    public IMovel criarMovel() {
        return new Sofa();
    }
}

// Exemplo de uso do Factory Method
public class Main {
    public static void main(String[] args) {
        // Criando uma fábrica de cadeiras
        FabricaDeMoveis fabricaDeCadeiras = new FabricaDeCadeiras();
        IMovel cadeira = fabricaDeCadeiras.criarMovel();
        cadeira.fabricar();  // Saída: "Fabricando uma cadeira."

        // Criando uma fábrica de mesas
        FabricaDeMoveis fabricaDeMesas = new FabricaDeMesas();
        IMovel mesa = fabricaDeMesas.criarMovel();
        mesa.fabricar();  // Saída: "Fabricando uma mesa."

        // Criando uma fábrica de sofás
        FabricaDeMoveis fabricaDeSofas = new FabricaDeSofas();
        IMovel sofa = fabricaDeSofas.criarMovel();
        sofa.fabricar();  // Saída: "Fabricando um sofá."
    }
}

// Fonte: ChatGPT

Este exemplo em Java segue a mesma estrutura e lógica do exemplo em C#. Temos as interfaces IMovel e as classes concretas Cadeira, Mesa e Sofa. As classes abstratas FabricaDeMoveis e suas subclasses concretas FabricaDeCadeiras, FabricaDeMesas e FabricaDeSofas são responsáveis ​​pela criação dos objetos de móveis.

No método main, é mostrado como usar as fábricas para criar diferentes tipos de móveis e chamar o método fabricar() correspondente de cada objeto.

Lembre-se de que é necessário salvar o código em um arquivo com o nome “Main.java” para que seja executado corretamente.

Exemplo de implementação em Python

Python
# Produto: Interface dos objetos que o método fábrica cria
class IMovel:
    def fabricar(self):
        pass

# Produtos Concretos: Implementações da interface do Produto
class Cadeira(IMovel):
    def fabricar(self):
        print("Fabricando uma cadeira.")

class Mesa(IMovel):
    def fabricar(self):
        print("Fabricando uma mesa.")

class Sofa(IMovel):
    def fabricar(self):
        print("Fabricando um sofá.")

# Criadores: Definem o método fábrica que retorna um objeto do tipo Produto
class FabricaDeMoveis:
    def criar_movel(self):
        pass

# Criadores Concretos: Sobrescrevem o método fábrica para retornar uma instância de um Produto Concreto
class FabricaDeCadeiras(FabricaDeMoveis):
    def criar_movel(self):
        return Cadeira()

class FabricaDeMesas(FabricaDeMoveis):
    def criar_movel(self):
        return Mesa()

class FabricaDeSofas(FabricaDeMoveis):
    def criar_movel(self):
        return Sofa()

# Exemplo de uso do Factory Method
if __name__ == "__main__":
    # Criando uma fábrica de cadeiras
    fabrica_de_cadeiras = FabricaDeCadeiras()
    cadeira = fabrica_de_cadeiras.criar_movel()
    cadeira.fabricar()  # Saída: "Fabricando uma cadeira."

    # Criando uma fábrica de mesas
    fabrica_de_mesas = FabricaDeMesas()
    mesa = fabrica_de_mesas.criar_movel()
    mesa.fabricar()  # Saída: "Fabricando uma mesa."

    # Criando uma fábrica de sofás
    fabrica_de_sofas = FabricaDeSofas()
    sofa = fabrica_de_sofas.criar_movel()
    sofa.fabricar()  # Saída: "Fabricando um sofá."

# Fonte: ChatGPT

Neste exemplo em Python, definimos a classe IMovel como uma classe base (interface) e, em seguida, implementamos as classes concretas Cadeira, Mesa e Sofa, que herdam da classe base e implementam o método fabricar().

Temos a classe base FabricaDeMoveis, que define o método criar_movel(). Em seguida, temos as classes concretas FabricaDeCadeiras, FabricaDeMesas e FabricaDeSofas, que herdam da classe base e implementam o método criar_movel() para retornar uma instância correspondente do produto concreto.

No trecho de código final, criamos instâncias das fábricas e usamos o método criar_movel() para criar diferentes tipos de móveis e chamar o método fabricar() correspondente de cada objeto.

Lembre-se de que é necessário salvar o código em um arquivo com a extensão “.py” para executá-lo corretamente utilizando a linguagem Python.

Factory Method e Outros Padrões de Projeto

O Factory Method não é o único padrão de projeto disponível. Existem outros, como Singleton, Prototype, Builder, entre outros. Cada um tem sua utilidade e aplicabilidade. O que diferencia o Factory Method é a flexibilidade que ele proporciona na criação de objetos.

Vantagens do Factory Method

Algumas das principais vantagens do Factory Method incluem:

  1. Permite maior flexibilidade e reutilização de código.
  2. Oferece um isolamento eficaz do código de criação de objetos.
  3. Proporciona um controle maior sobre o processo de criação de objetos.

Desvantagens do Factory Method

Apesar de suas vantagens, o Factory Method também tem suas desvantagens. Uma delas é a complexidade adicional que pode ser introduzida no código. Outra é a necessidade de criar uma nova subclasse para cada novo tipo de produto.

Quando Usar o Factory Method?

O Factory Method é útil quando:

  1. Você não sabe de antemão os tipos e dependências exatas dos objetos com os quais seu código deve funcionar.
  2. Você deseja fornecer uma maneira de estender a lógica de criação de objetos internamente.

Quando Não Usar o Factory Method?

Por outro lado, o Factory Method pode não ser a melhor escolha quando:

  1. A classe só pode ter uma instância (nesse caso, Singleton pode ser mais adequado).
  2. Você quer construir objetos complexos passo a passo (aqui, o padrão Builder pode ser mais adequado).

Como o Factory Method Ajuda na Solução de Problemas de Negócio?

Em um ambiente de negócios, o Factory Method pode ser uma ferramenta poderosa para resolver problemas de negócio. Por exemplo, em uma empresa de software que fornece soluções personalizadas para cada cliente, o Factory Method pode ser usado para criar diferentes tipos de soluções com base nas necessidades específicas de cada cliente.

Conclusão

O Factory Method é um padrão de projeto de software valioso que oferece flexibilidade, isolamento de código e controle sobre o processo de criação de objetos. No entanto, como qualquer ferramenta, deve ser usada com cuidado e entendimento. Nunca se esqueça de que o objetivo principal é resolver problemas de negócio. O Factory Method é um meio para esse fim, e não o fim em si.

Esse conteúdo é parte do material disponibilizado para os participantes do meu grupo de estudos de Padrões de Projeto. Você quer participar desse grupo? Clique aqui e veja como funciona.

Dúvidas Frequentes

O que é o padrão Factory Method?
O Factory Method é um padrão de projeto de software que fornece uma maneira de criar objetos sem especificar a classe exata do objeto que será criado.

Quais são as principais vantagens do Factory Method?
As principais vantagens do Factory Method incluem flexibilidade na criação de objetos, isolamento de código e controle sobre o processo de criação.

Quais são as desvantagens do Factory Method?
Apesar de suas vantagens, o Factory Method também pode introduzir complexidade adicional no código e requer a criação de uma nova subclasse para cada novo tipo de produto.

Quando devo usar o Factory Method?
O Factory Method é útil quando você não sabe de antemão os tipos e dependências exatas dos objetos com os quais seu código deve funcionar, ou quando deseja fornecer uma maneira de estender a lógica de criação de objetos internamente.

Factory Method pode ser usado para resolver problemas de negócio?
Sim, em um ambiente de negócios, o Factory Method pode ser uma ferramenta poderosa para resolver problemas de negócio, especialmente em empresas que fornecem soluções personalizadas para cada cliente.

Quer se aprofundar neste tema?

Então participe do grupo de estudos de Padrões de Projeto.

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Participe do
grupo intensivo de

Padrões de Projeto

com

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Participe do
grupo intensivo de

Padrões de Projeto

com

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Veja outros artigos relacionados

Quer Melhorar Seu Design? Aplique CQS

Nesse mundo cada vez mais acelerado da tecnologia da informação, uma das metas constantes para desenvolvedores é a otimização e...

Você Precisa Conhecer o State Pattern

Em minha jornada como desenvolvedor de software, a descoberta e compreensão do State Pattern foi um divisor de águas, assim...

Como padrões ajudam a reduzir o impacto da escassez de recursos

Quando pensamos em software development, um dos grandes desafios é criar sistemas eficientes especialmente em ambientes com recursos limitados. Diante...

Programa ElemarJR de
Aceleração de Resultados, do Jeito Certo

Aproveite nossa OFERTA ESPECIAL e adquira o combo completo com acesso a todos os grupos de estudos.

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Factory Method: O que é e para que serve?:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Factory Method: O que é e para que serve?

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Factory Method: O que é e para que serve?:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Factory Method: O que é e para que serve?:

Mentoria em Arquitetura de Software

Ênfase em Systems Design

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Reproduzir vídeo

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Programa ElemarJR de Aceleração, Do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Programa ElemarJR de Aceleração, Do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

× Precisa de ajuda?