In een ander topic zegt Wouter op een gegeven moment:
Wouter J op 02/03/2014 16:08:06
allereerst zou ik geen setters gebruiken voor id en value. Dat zijn verplichte waarden, geef die dus mee aan de constructor en nog mooier: gebruik een factory: Session::create('user', 'Ozzie')
Waarom zou je een factory gebruiken ipv een constructor?
Waarom...
<?php
$session = Session::create('user', 'Ozzie');
?>
en niet...
<?php
$session = new Session('user', 'Ozzie');
?>
Wat is het verschil/voordeel?
Als je beginner bent dan adviseer ik je altijd eenvoudig te programmeren.
Gebruik Object-oriented concept en namespace die zijn belangrijk.
Factory design is echt niet dat belangrijk voor een beginner.
Factory design is gebaseerd op een eenvoudig princiep.
Net als een fabriek dat maakt verschillen producten.
Het kan een global fabriek of meerder sub fabrieken.
Dus een factory is een class dat bestaat uit meerder static methoden die creëren objecten en geven die objecten terug.
Bijv.
$Session = $Factory::creatSession('user', 'Ozzie');
$Auto = $Factory::creatProduct( ‘auto’);
….
Het kan ook heel global zijn
$Session = $Factory::creat('user', 'Ozzie');
$Auto = $Factory::creat( ‘auto’);
P.S
$session = Session::create('user', 'Ozzie');
respecteert niet de Factory design.
Hier is een simpel voorbeeld zonder factory design.
if (class_exists('auto') && class_exists('motor') && class_exists('wielen') ) {
$wielen= new wielen();
$motor= new motor();
$auto = new auto($motor, $wielen);
}
met factory design
public static function creat($nameObject) {
if($nameObject=='auto') $this->creatAuto();
}
private function creatAuto() {
if (class_exists('auto') && class_exists('motor') && class_exists('wielen') ) {
$wielen= new wielen();
$motor= new motor();
return new auto($motor, $wielen);
} else {
die('fatal error, class not exist ');
}
}
Maar in het voorbeeld hierboven, waarom zegt Wouter daar "en nog mooier: gebruik een factory: Session::create('user', 'Ozzie')"? Weet jij waarom hij dat mooier vindt? Ik zie het voordeel niet.
Wat betreft jouw voorbeeld... als je een autoloader gebruikt heb je zoiets toch niet nodig?
Ik dacht dat factory's vooral bedoeld waren om een object te maken met een bepaalde configuratie, zodat je dat niet telkens hoeft te herhalen.
public static function register($model, $factory)
{
if ( ! is_string($factory) || ! method_exists($factory, 'create'))
throw new InvalidArgumentException('invalid factory');
Met een factory maak je een object aan van een onbekende class. Vaak weet je wel dat het een bepaalde interface implementeert, of een class X is of als parent heeft. Maar zeker weten welke class doe je vaak niet.
Soms het maken van een object bestaat uit veel stappen.
In plaats dat je dat herhaaldelijk doet elke keer als je een object wil maken.
Doe je dat een keer in jouw Factory class.
Ah oke... dat is inderdaad een andere, meer zinvolle, interpretatie. Volgens mij kun je dit soort dingen ook oplossen met een servicecontainer?
Hoe dan ook snap ik nog steeds niet waarom Wouter in het genoemde voorbeeld een factory "mooier" noemt, want in het betreffende geval zie ik geen meerwaarde ten opzichte van het aanmaken van een object en het meegeven van de argumenten aan de constructor.
Toevoeging op 07/03/2014 20:26:39:
>> Soms het maken van een object bestaat uit veel stappen.
In plaats dat je dat herhaaldelijk doet elke keer als je een object wil maken.
Doe je dat een keer in jouw Factory class.
Ja, maar in het voorbeeld wat Wouter geeft, is dit toch niet van toepassing?