Middle
Jaký je rozdíl mezi vzorem 'továrna' a 'tovární metodou'?
sobes.tech AI
Odpověď od AI
Vzor "Továrna" (Simple Factory) je odpovědný za vytváření objektů jednoho typu, skrývá logiku jejich instancování. Představuje samostatnou třídu nebo statickou funkci, která na základě vstupních parametrů vytvoří a vrátí konkrétní objekt.
<?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("Invalid product type");
}
}
}
Vzor "Funkce továrny" (Factory Method) je vytvářející vzor návrhu, který definuje rozhraní pro vytvoření objektu, ale umožňuje podtřídám rozhodnout, jakou třídu instancovat. Přenáší odpovědnost za vytváření objektů na podtřídy.
<?php
interface Product
{
public function operation(): string;
}
class ConcreteProductA implements Product
{
public function operation(): string
{
return "Result of ConcreteProductA";
}
}
class ConcreteProductB implements Product
{
public function operation(): string
{
return "Result of ConcreteProductB";
}
}
abstract class Creator
{
abstract public function factoryMethod(): Product;
public function someOperation(): string
{
// Call the factory method to create a Product object.
$product = $this->factoryMethod();
// Now, use the product.
return "Creator: The same creator's code has just worked with " . $product->operation();
}
}
class ConcreteCreatorA extends Creator
{
public function factoryMethod(): Product
{
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator
{
public function factoryMethod(): Product
{
return new ConcreteProductB();
}
}
Hlavní rozdíl je následující:
| Charakteristika | Vzor "Továrna" (Simple Factory) | Vzor "Funkce továrny" (Factory Method) |
|---|---|---|
| Odpovědnost | Jedna třída nebo statická funkce vytváří objekty. | Podtřídy určují, jaký typ objektu bude vytvořen. |
| Flexibilita | Omezená. Vyžaduje změny v tovární třídě při přidání nového typu produktu. | Vysoce rozšiřitelná přidáním nových podtříd-tvořitelů. |
| Dědičnost | Obvykle se nepoužívá nebo se používá pro vytvoření jedné tovární třídy. | Závisí na dědičnosti pro určení typu objektu, který má být vytvořen. |
| Úroveň abstrakce | Méně abstraktní. | Více abstraktní. |
| Cíl | Centralizované vytváření objektů. | Delegování vytváření objektů podtřídám. |