Metoda klasy prostej fabryki tworzy nowe obiekty na podstawie argumentów.Prosta fabryka umożliwia nam hermetyzację procesu tworzenia nowych obiektów,dzięki czemu nasz kod staje się lepszy i bardziej profesjonalny – przedstawmy to na przykładzie.
Wyobraź sobie ,że bierzesz udział w konkursie “Fabryka Nagrod” w którym do wygrania jest jeden z trzech przedmiotów takich jak komputer,telefon,plecak.Programista tworzy kod odpowiedzialny za losowanie
<?php
class nagroda
{
private $objFabrykaNagrod;
public function __construct($objnagrodaWygrales)
{
switch($objnagrodaWygrales)
{
case 'komputer' :
$this->objFabrykaNagrod = new komputer();
break;
case 'telefon' :
$this->objFabrykaNagrod = new telefon();
break;
case 'plecak' :
$this->objFabrykaNagrod = new plecak();
break;
}
}
public function wyswietlInformajce()
{
echo 'Wygrales '.$this->objFabrykaNagrod->nazwaPrzedmiotu().'<br>'.$this->objFabrykaNagrod->pakowaniePrzedmiotu().'<br>';
}
}
abstract class nagrodaWygrales
{
abstract public function nazwaPrzedmiotu();
public function pakowaniePrzedmiotu()
{
return "Zapakuj w pudełku tekturowym";
}
}
class komputer extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "komputer";
}
}
class telefon extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "telefon";
}
}
class plecak extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "plecak";
}
}
$tablicaNagrod = array('komputer','telefon','plecak');
$losowanie = array_rand($tablicaNagrod);
$objNagroda = new nagroda($tablicaNagrod[$losowanie]);
$objNagroda->wyswietlInformajce();
?>
Programista,po pewnym czasie natchnął się na wzorzec “prosta fabryka” i postanowił odizolować zmienne dane swojej aplikacji stosując tak zwany proces hermetyzacji
Hermetyzacja jest to proces w którym odizolowujemy zmienne fragmenty naszego kodu od stałych fragmentów w taki sposób ,aby w przyszłości można było rozbudować nasz kod nie modyfikując stałej części naszej aplikacji
W naszym przypadu zmiennym fragmentem jest ta część kodu.
switch($objnagrodaWygrales)
{
case 'komputer' :
$this->objFabrykaNagrod = new komputer();
break;
case 'telefon' :
$this->objFabrykaNagrod = new telefon();
break;
case 'plecak' :
$this->objFabrykaNagrod = new plecak();
break;
}
kod odpowiedzialny jest za tworzenie nowych obiektów.Po procesie hermetyzacji nasz kod wygląda tak
<?php
class nagroda
{
private $objFabrykaNagrod;
public function __construct($objnagrodaWygrales)
{
$this->objFabrykaNagrod = new FabrykaNagrod();
$this->objFabrykaNagrod = $this->objFabrykaNagrod->przedmiot($objnagrodaWygrales);
}
public function wyswietlInformajce()
{
echo 'Wygrales '.$this->objFabrykaNagrod->nazwaPrzedmiotu().'<br>'.$this->objFabrykaNagrod->pakowaniePrzedmiotu().'<br>';
}
}
class FabrykaNagrod
{
public function przedmiot($wygrales)
{
switch($wygrales)
{
case 'komputer' :
return new komputer();
break;
case 'telefon' :
return new telefon();
break;
case 'plecak' :
return new plecak();
break;
}
}
}
abstract class nagrodaWygrales
{
abstract public function nazwaPrzedmiotu();
public function pakowaniePrzedmiotu()
{
return "Zapakuj w pudełku tekturowym";
}
}
class komputer extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "komputer";
}
}
class telefon extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "telefon";
}
}
class plecak extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "plecak";
}
}
$tablicaNagrod = array('komputer','telefon','plecak');
$losowanie = array_rand($tablicaNagrod);
$objNagroda = new nagroda($tablicaNagrod[$losowanie]);
$objNagroda->wyswietlInformajce();
?>
Programista stosując hermetyzacje stworzył kod ,który w przyszłości będzie mógł rozbudować.Programista postanowił w swoim kodzie dodać dwie klasy serwis,oraz zwyciężca.Klasa serwis odzorowuje serwis w którym naprawiany jest uszkodzony sprzęt z naszego konkursu.Natomiast klasa zwyciezca reprezentuje osobię która to wygrała konkurs.
<?php
class nagroda
{
private $objFabrykaNagrod;
public function __construct($objnagrodaWygrales)
{
$this->objFabrykaNagrod = new FabrykaNagrod();
$this->objFabrykaNagrod = $this->objFabrykaNagrod->przedmiot($objnagrodaWygrales);
}
public function wyswietlInformajce()
{
echo 'Wygrales '.$this->objFabrykaNagrod->nazwaPrzedmiotu().'<br>'.$this->objFabrykaNagrod->pakowaniePrzedmiotu().'<br>';
}
}
class FabrykaNagrod
{
public function przedmiot($wygrales)
{
switch($wygrales)
{
case 'komputer' :
return new komputer();
break;
case 'telefon' :
return new telefon();
break;
case 'plecak' :
return new plecak();
break;
}
}
}
abstract class nagrodaWygrales
{
abstract public function nazwaPrzedmiotu();
public function pakowaniePrzedmiotu()
{
return "Zapakuj w pudełku tekturowym";
}
}
class komputer extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "komputer";
}
}
class telefon extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "telefon";
}
}
class plecak extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "plecak";
}
}
class serwis
{
public function __construct($objNagroda)
{
echo 'Naprawiam '.$objNagroda->nazwaPrzedmiotu().'<br>';
}
}
class zwyciezca
{
public function __construct($objNagroda)
{
echo 'Chce odebrać moją nagrode - '.$objNagroda->nazwaPrzedmiotu().'<br>';
}
}
$tablicaNagrod = array('komputer','telefon','plecak');
$losowanie = array_rand($tablicaNagrod);
$objNagroda = new nagroda($tablicaNagrod[$losowanie]);
$objNagroda->wyswietlInformajce();
$objFabryka = new FabrykaNagrod();
$objNaprawa = new serwis($objFabryka->przedmiot('komputer'));
$objZwyciezca = new zwyciezca($objFabryka->przedmiot('komputer'));
?>
Na początku wspomniałem ,że metoda fabryczna może być statyczna dzięki czemu nie musimy tworzyć obiektu fabryki w konstruktorze klasy nagroda
<?php
class nagroda
{
private $objFabrykaNagrod;
public function __construct($objnagrodaWygrales)
{
$this->objFabrykaNagrod = FabrykaNagrod::przedmiot($objnagrodaWygrales);
}
public function wyswietlInformajce()
{
echo 'Wygrales '.$this->objFabrykaNagrod->nazwaPrzedmiotu().'<br>'.$this->objFabrykaNagrod->pakowaniePrzedmiotu().'<br>';
}
}
class FabrykaNagrod
{
public static function przedmiot($wygrales)
{
switch($wygrales)
{
case 'komputer' :
return new komputer();
break;
case 'telefon' :
return new telefon();
break;
case 'plecak' :
return new plecak();
break;
}
}
}
abstract class nagrodaWygrales
{
abstract public function nazwaPrzedmiotu();
public function pakowaniePrzedmiotu()
{
return "Zapakuj w pudełku tekturowym";
}
}
class komputer extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "komputer";
}
}
class telefon extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "telefon";
}
}
class plecak extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "plecak";
}
}
$tablicaNagrod = array('komputer','telefon','plecak');
$losowanie = array_rand($tablicaNagrod);
$objNagroda = new nagroda($tablicaNagrod[$losowanie]);
$objNagroda->wyswietlInformajce();
?>
kod php z matodą statyczną oraz z klasami serwis i zwyciezca
<?php
class nagroda
{
private $objFabrykaNagrod;
public function __construct($objnagrodaWygrales)
{
$this->objFabrykaNagrod = FabrykaNagrod::przedmiot($objnagrodaWygrales);
}
public function wyswietlInformajce()
{
echo 'Wygrales '.$this->objFabrykaNagrod->nazwaPrzedmiotu().'<br>'.$this->objFabrykaNagrod->pakowaniePrzedmiotu().'<br>';
}
}
class FabrykaNagrod
{
public static function przedmiot($wygrales)
{
switch($wygrales)
{
case 'komputer' :
return new komputer();
break;
case 'telefon' :
return new telefon();
break;
case 'plecak' :
return new plecak();
break;
}
}
}
abstract class nagrodaWygrales
{
abstract public function nazwaPrzedmiotu();
public function pakowaniePrzedmiotu()
{
return "Zapakuj w pudełku tekturowym";
}
}
class komputer extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "komputer";
}
}
class telefon extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "telefon";
}
}
class plecak extends nagrodaWygrales
{
public function nazwaPrzedmiotu()
{
return "plecak";
}
}
class serwis
{
public function __construct($objNagroda)
{
echo 'Naprawiam '.$objNagroda->nazwaPrzedmiotu().'<br>';
}
}
class zwyciezca
{
public function __construct($objNagroda)
{
echo 'Chce odebrać moją nagrode - '.$objNagroda->nazwaPrzedmiotu().'<br>';
}
}
$tablicaNagrod = array('komputer','telefon','plecak');
$losowanie = array_rand($tablicaNagrod);
$objNagroda = new nagroda($tablicaNagrod[$losowanie]);
$objNagroda->wyswietlInformajce();
$objNaprawa = new serwis(FabrykaNagrod::przedmiot('komputer'));
?>
Myśle ,że ten przykład wyjaśnił ci zasade działania prostej fabryki.