2010-01-18 19 views
76

To dezorientuje mnie, w najprostszy sposób, co on robi? Udawaj, że wyjaśniasz matce lub komuś, kogo prawie proszę.Co to jest wzór fabryczny w PHP?

+105

Moja matka nie zrozumie to i tak ... –

+6

@JasonDavis Trzymam odpowiadając na pytania ... I” zaczyna mi się czuć jak prześladowca. –

Odpowiedz

159

Fabryka tworzy obiekt. Tak więc, jeśli chcesz zbudować

class A{ 
    public $classb; 
    public $classc; 
    public function __construct($classb, $classc) 
    { 
     $this->classb = $classb; 
     $this->classc = $classc; 
    } 
    } 

Nie chcesz polegać na konieczności wykonywania kodu za każdym razem następujące utworzeniu obiektu

$obj = new ClassA(new ClassB, new Class C); 

tam jest fabryka przyjdzie. My określić fabrykę dbać o to dla nas:

class Factory{ 
    public function build() 
    { 
     $classc = $this->buildC(); 
     $classb = $this->buildB(); 
     return $this->buildA($classb, $classc); 

    } 

    public function buildA($classb, $classc) 
    { 
     return new ClassA($classb, $classc); 
    } 

    public function buildB() 
    { 
     return new ClassB; 
    } 

    public function buildC() 
    { 
     return new ClassC; 
    } 
} 

teraz wszystko, co musimy zrobić, to

$factory = new Factory; 
$obj  = $factory->build(); 

Prawdziwa zaleta to zmiana klasy. Powiedzmy chcieliśmy przekazać w innej ClassC:

class Factory_New extends Factory{ 
    public function buildC(){ 
     return new ClassD; 
    } 
} 

lub nowej ClassB:

class Factory_New2 extends Factory{ 
    public function buildB(){ 
     return new ClassE; 
    } 
} 

Teraz możemy użyć dziedziczenia łatwo modyfikować jak klasa jest stworzony, aby umieścić w innym zestawie klas.

Dobrym przykładem może być ta klasa użytkownik:

class User{ 
    public $data; 
    public function __construct($data) 
    { 
     $this->data = $data; 
    } 
} 

W tej klasie $data jest klasa używamy do przechowywania naszych danych. Teraz dla tej klasy, powiedzmy, że używamy sesji do przechowywania naszych danych.Fabryka będzie wyglądać następująco:

class Factory{ 
    public function build() 
    { 
     $data = $this->buildData(); 
     return $this->buildUser($data); 
    } 

    public function buildData() 
    { 
     return SessionObject(); 
    } 

    public function buildUser($data) 
    { 
     return User($data); 
    } 
} 

Teraz, powiedzmy, że zamiast chcemy przechowywać wszystkich naszych danych w bazie danych, to jest bardzo proste, aby go zmienić:

class Factory_New extends Factory{ 
    public function buildData() 
    { 
     return DatabaseObject(); 
    } 
} 

fabryki projekt wzór używamy do kontrolowania tego, jak układamy obiekty razem, a używanie poprawnych wzorów fabrycznych pozwala nam tworzyć niestandardowe obiekty, których potrzebujemy.

+10

+1 świetny przykład – Parrots

+2

To było dużo pisania. Teraz będę musiał umieścić go na mojej wiki w pewnym momencie. –

+0

dzięki to pomaga niektóre – JasonDavis

16

Jak prawdziwy fabryce życia, tworzy coś i zwraca go.

Wyobraź sobie coś takiego

$joe = new Joe(); 
$joe->say('hello'); 

lub metody fabryki

Joe::Factory()->say('hello'); 

Wdrożenie metody fabryki stworzy nową instancję i odesłać go.

+1

Dobry przykład, zadziwia mnie, jak różnorodne są implementacje tego wzorca. Kiedy nazywa się to statycznie, zakładam, że można uzyskać odwołanie do instancji, aby później ponownie użyć tej samej instancji? tj. $ joe = Joe :: Factory() -> say ('hello'); – stefgosselin

+0

na pewno jako 5.6 można też zrobić (nowy Joe()) -> powiedzieć ("cześć"); – Pancho

1

Ogólnie rzecz biorąc, "fabryka" produkuje coś: w przypadku programowania zorientowanego obiektowo "fabryczny wzór" tworzy obiekty.

Nie ma znaczenia, czy jest w języku PHP, C# czy jakimkolwiek innym języku zorientowanym obiektowo.

1

Fabryczny wzór projektu (wzór fabryczny) służy do luźnego łączenia. Podobnie jak znaczenie fabryki, dane do fabryki (dane produkcyjne) do końcowego użytkownika. W ten sposób fabryka przełamuje ścisłe powiązanie między źródłem danych a procesem przetwarzania danych.

0

Ta odpowiedź jest związana z innym postem, w którym Daniel White powiedział, że używa fabryki do tworzenia połączenia MySQL przy użyciu wzoru fabrycznego.

Dla połączenia MySQL wolałbym używać wzorca singleton, ponieważ chcesz korzystać z tego samego połączenia, , aby uzyskać dostęp do bazy danych, nie twórz kolejnej.

0

Klasyczne podejście do instancji obiektu wynosi:

$Object=new ClassName(); 

PHP ma zdolność do dynamicznego tworzenia obiektu z nazwy zmiennej przy użyciu następującej składni:

$Object=new $classname; 

gdzie zmienna $ classname zawiera nazwa klasy pierwszej chce utworzyć instancję.

więc klasyczny faktoring obiekt będzie wyglądać następująco:

function getInstance($classname) 
{ 
    if($classname==='Customer') 
    { 
    $Object=new Customer(); 
    } 
    elseif($classname==='Product') 
    { 
    $Object=new Product(); 
    } 
    return $Object; 
} 

i jeśli zadzwonisz getInstance („Produkt”) Funkcja ta fabryka stworzy i zwrot przedmiotu produktu. W przeciwnym razie, jeśli wywołasz funkcję getInstance ("Klient"), fabryka utworzy i zwróci obiekt typu Klient (utworzony z klasy Customer()).

Nie trzeba za to więcej, można wysłać „produkt” lub „klient” (dokładne nazwy istniejących klasach) jako wartość zmiennej dla dynamicznej konkretyzacji:

$classname='Product'; 
$Object1=new $classname; //this will instantiate new Product() 

$classname='Customer'; 
$Object2=new $classname; //this will instantiate new Customer() 
0

Dla przypomnienia, w łatwe słowa, jak mówi fabryka @Pindatjuh, zwraca obiekt.

Czym zatem różni się konstruktor? (to samo)

  1. Konstruktor używa własnej instancji.
  2. Coś, co chcę, aby było coś bardziej zaawansowanego i nie chcę powiększać obiektu (lub dodawać zależności).
  3. Konstruktor wywoływany jest po utworzeniu każdej instancji. Czasami tego nie chcesz.

    Na przykład załóżmy, że za każdym razem, gdy utworzę obiekt Konta klasy, odczytam z bazy danych plik i użyję go jako szablonu.

Korzystanie konstruktor:

class Account { 
     var $user; 
     var $pwd; 
     var ... 
     public __construct() { 
     // here i read from the file 
     // and many other stuff 
     } 
} 

Korzystanie fabryczne:

class Account { 
     var $user; 
     var $pwd; 
     var ... 
} 
class AccountFactory { 
     public static Create() { 
     $obj=new Account(); 
     // here we read the file and more stuff. 
     return $obj; 
     }