llo,

Ik ben me momenteel aan het verdiepen in de verschillende Design Patterns (voornamelijk van GoF) en heb hierover de volgende vraag:

Overal waar ik kijk worden Factories eerst geinstantieerd, waarna de methoden worden aangeroepen. Waarom zou ik een factory niet op een statische manier aanroepen (scheelt code toch?):

Zoals ik het vaak zie:
$factory = new ObjectFactory;
$object = $factory->makeNewObject();

Zoals ik het wil zien:
$object = ObjectFactory::makeNewObject();

Dus waarom gebruikt iedereen de eerste methode, terwijl de tweede methode simpeler lijkt?

Mvg,


Tim
Interessant topic! Een factory pattern voor een pizzeria kan er echter ook anders uitzien. Hebben jullie op- en aanmerkingen bij de volgende aanpak?

<?php
/* Interfaces voor pizzafabriek en pizza */

interface PizzaFactory
{
public function makePizza();
}

interface Pizza
{
public function getType();
}


/* Implementaties voor een Pizza Margherita */

class PizzaMargheritaFactory implements PizzaFactory
{
public function makePizza()
{
return new PizzaMargherita();
}
}

class PizzaMargherita implements Pizza
{
public function getType()
{
return 'Margherita';
}
}


/* Applicatie bakt een Pizza Margherita */

$factory = new PizzaMargheritaFactory();
$pizza = $factory->makePizza();
echo $pizza->getType();
?>
Het feit dat je telkens dezelfde instance krijgt is voor mij al het punt om ervan af te stappen, maar ik kan begrijpen dat beginners zoals de TS dit waarschijnlijk wel een mooi pattern vinden.

Om het topic wat completer te maken zou ik mijn vorm hier neer zetten, de Service container:
<?php
$container = new Container();

$container->set('pizzaria', function($c) {
return new Pizzaria();
});

$container->set('pizza', function($c) {
if (!isset($c->get('pizza.type')) {
// ... error
}

switch ($c->get('pizza.type')) {
case 'salami':
$pizza = new SalamiPizza();
break;

// ...
};

return $c->get('pizzaria')->getOven()->makePizza($pizza);
});

$container->set('service.waiter', function($c) {
$waiter = $c->get('service')->getFreeWaiters();

return $waiter[0]; // krijg de eerste vrije ober
});

// gebruik
$container->set('pizza.type', 'salami');

$pizza = $container->get('pizza');

if ($pizza->isBaked()) {
$container->get('service.waiter')->serve($pizza);
}
?>

[hr]

Ward, dat van jou gaat zijn nut voor bij. Het Factory pattern komt voor uit het feit dat je het geen dat variabel is moet weghalen uit het geen dat constant blijft. Niet door iets constants in de Factory te stoppen.

Reageren