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. |