Factory

Můžete se dostat do okamžiku, že máte perfektní třídy, kde můžete nastavit prakticky cokoliv, aniž byste museli zasahovat do kódu. To však může být doprovázeno také tím, že k vytvoření konkrétního objektu potřebujete mnoho parametrů. S tímhle problémem nám pomůže třída nebo metoda Factory.

Příklad:
Chceme si otevřít továrny a přejeme si, aby vyráběly ze dřeva nebo z kovu. Když děláme ze dřeva, tak odchází z továrny židle, stoly, dveře a z kovu pouze vrata.

<?php
class Tovarna
{
    private $material;
    private $vyrobek;

    public function __construct($material, $vyrobek)
    {
        $this->material = $material;
        $this->vyrobek = $vyrobek;
    }

    public function pracuj()
    {
        return 'Dokončeno - ' . $this->vyrobek . ' z ' . $this->material;
    }
}

class NovaTovarna
{
    public static function otevrit($jmenoTvarny)
    {
        switch ($jmenoTvarny) {
            case 'vyrobaZidli':
                return new Tovarna('dřevo', 'židle');
                break;
            case 'vyrobaStolu':
                return new Tovarna('dřevo', 'stůl');
                break;
            case 'vyrobaDveri':
                return new Tovarna('dřevo', 'dveře');
                break;
            case 'vyrobaVrat':
               return new Tovarna('kov', 'vrata');
               break;
           default:
               return false;
        }
    }
}

$mojeTovarna1 = NovaTovarna::otevrit('vyrobaZidli');
$mojeTovarna2 = NovaTovarna::otevrit('vyrobaVrat');

echo $mojeTovarna1->pracuj(); //Dokončeno - židle z dřevo
echo $mojeTovarna2->pracuj(); //Dokončeno - vrata z kov

V našem příkladu jsme využili třídu Factory (NovaTovarna) k vytvoření konkrétní továrny.

Factory pomáhá k lepší čitelnosti kódu, protože si nezanášíme používanou třídu přednastavováním a ani nesnižujeme její variabilitu.