Sobes.tech
Middle

Qual é a diferença entre o padrão 'fábrica' e o 'método de fábrica'?

sobes.tech IA

Resposta da IA

O padrão "Fábrica" (Simple Factory) é responsável por criar objetos de um mesmo tipo, escondendo a lógica da sua instanciação. É uma classe separada ou uma função estática que, com base nos parâmetros de entrada, cria e devolve um objeto concreto.

<?php

class ProductA {}
class ProductB {}

class ProductFactory
{
    public static function createProduct(string $type)
    {
        switch ($type) {
            case 'A':
                return new ProductA();
            case 'B':
                return new ProductB();
            default:
                throw new \InvalidArgumentException("Tipo de produto inválido");
        }
    }
}

O padrão "Método de Fábrica" (Factory Method) é um padrão de criação que define uma interface para criar um objeto, mas permite às subclasses decidir qual classe instanciar. Ele transfere a responsabilidade de criar objetos para as subclasses.

<?php

interface Product
{
    public function operation(): string;
}

class ConcreteProductA implements Product
{
    public function operation(): string
    {
        return "Resultado de ConcreteProductA";
    }
}

class ConcreteProductB implements Product
{
    public function operation(): string
    {
        return "Resultado de ConcreteProductB";
    }
}

abstract class Creator
{
    abstract public function factoryMethod(): Product;

    public function someOperation(): string
    {
        // Chamar o método de fábrica para criar um produto.
        $product = $this->factoryMethod();
        // Agora, usar o produto.
        return "Creator: O mesmo código do criador acabou de trabalhar com " . $product->operation();
    }
}

class ConcreteCreatorA extends Creator
{
    public function factoryMethod(): Product
    {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator
{
    public function factoryMethod(): Product
    {
        return new ConcreteProductB();
    }
}

A principal diferença é a seguinte:

Característica Padrão "Fábrica" (Simple Factory) Padrão "Método de Fábrica" (Factory Method)
Responsabilidade Uma classe ou função estática cria objetos. Subclasses determinam qual classe criar.
Flexibilidade Limitada. Requer alteração na classe fábrica ao adicionar um novo tipo de produto. Alta. Pode ser facilmente estendido adicionando novas subclasses criadoras.
Herança Geralmente não é usado ou é usado para criar uma única fábrica. Baseia-se na herança para determinar qual objeto criar.
Nível de abstração Menos abstrato. Mais abstrato.
Objetivo Criação centralizada de objetos. Delegação da criação de objetos às subclasses.