Prosta fabryka nie jest wzorcem jest idiomem używanym przez programistów.

Moim zdaniem jest spodowowane tym iż prosta fabryka tak naprawde jest zwykłą pojedyńczą metodą(może być statyczna) ,która to znajduje się w oddzielnej klasie.Klasa ta nie dziedziczy po innej klasie ani nie jest dziedziczona przez inne klasy.

Data dodania: 2010-03-06

Wyświetleń: 2833

Przedrukowań: 0

Głosy dodatnie: 0

Głosy ujemne: 0

WIEDZA

0 Ocena

Licencja: Creative Commons

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.

Licencja: Creative Commons
0 Ocena