2010-03-05 16 views
18

Właśnie przeczytałem metodę Factory. Rozumiem, że zapewnia sposób delegowania instancji do podklas. Ale nie mogłem zrozumieć możliwych zastosowań w rzeczywistym świecie.Rzeczywiste przykłady wzorców metod fabryki

Czy ktoś może podać jeden typowy przykład pokazujący, w jaki sposób można zastosować wzór metody Factory, abym mógł odnieść się do tego, co przeczytałem.

Problem, dla którego wzór metody fabrycznej jest najlepszym rozwiązaniem, byłby wystarczający do wyjaśnienia.

Odpowiedz

41

Klasa implementująca wzór fabryczny działa jako pomost między wieloma klasami. Rozważ przykład użycia wielu serwerów baz danych, takich jak SQL Server i Oracle. Jeśli tworzysz aplikację używającą bazy danych SQL Server jako zaplecza, ale w przyszłości będziesz musiał zmienić bazę danych backendu na oracle, będziesz musiał zmodyfikować cały swój kod, jeśli nie napisałeś swojego kodu zgodnie z wzorcem projektu fabrycznego.

W przypadku projektu fabrycznego należy wykonać bardzo mało pracy, aby to osiągnąć. Klasa realizująca wzór fabryczny dba o Ciebie i zmniejsza Twoje obciążenie. Przełączanie się z serwera bazy danych w ogóle Cię nie niepokoi. Trzeba tylko wprowadzić niewielkie zmiany w pliku konfiguracyjnym.

+1

+1 dla właściwego przykładu. Przykładowy kod do tego można znaleźć pod adresem http://davidhayden.com/blog/dave/archive/2005/04/02/923.aspx – blitzkriegz

+1

@Mahatma: dzięki za ten link :) – Sarfraz

+0

@Sarfraz idealny przykład, pomógł mi wizualizować przykład z prawdziwego świata. +1 za to. – tugberk

2

Od API Zajmuję teraz:

WebGalleryFactory factory = WebGalleryFactory.newInstance (WebGalleryType.PICASA); 
WebAlbum album = factory.createAlbum (title, description); 

W tym przykładzie używam Factory Method stworzyć Abstract Factory pewnego typu (PICASA w przykładzie).

Te dwa wzory są często używane razem.

+3

Dlaczego nie tworzyć bezpośrednio prezentacji PicasaWebGalleryFactory? – Rekin

+1

Dlaczego w ogóle jest to fabryka? Nie możesz mieć klasy WebGallery i podklasy PicasaWebGallery? – paul

3

Zend_Db używa go w swojej klasie Zend_Db_Adapter, aby umożliwić tworzenie różnego rodzaju obiektów baz danych na podstawie ustawień bazy danych przekazywanych z obiektu konfiguracyjnego.

+0

Inne przykłady metod fabrycznych: Zend_Cache :: factory(), Zend_Memory :: factory().Zend_Log_Writer ma również fabryczne metody inicjalizacji adapterów betonowych Zend_Log_Writer_Abstract. Jedno trzeba jednak zauważyć: te implementacje mają zasadniczo formę, gdy metoda fabryczna jest wtryskiwana bezpośrednio do produktu (nie ma oddzielnych klas AbstractCreator/ConcreteCreator). –

+0

Wystarczy ponownie sprawdzić kod: ZF faktycznie używa tak zwanej Simple Factory, która jest idiomem, a nie wzorem (opisanym w HF Design Patterns). Zobaczyłem także kilka statycznych metod fabrycznych, przynajmniej implementacja była bardzo podobna do tego, o czym mówili Bloch w Effective Java. I nie mogłem zlokalizować dokładnej implementacji Factory Method Pattern przez GoF. –

2

Jeden przykład z .NET Base Class Library (BCL) jest Control.CreateControlsInstance, który jest używany przez wielu innych członków (Windows Forms) klasy sterowania.

Można zastąpić tę chronioną metodę, aby zapewnić własny zbiór formantów, np. podczas wdrażania niestandardowego formantu.

4

Przykładowy kod php:

interface DbTable 
{ 
    public function create($array); 
} 

class MySqlTable implements DbTable 
{ 
    public function create($array) 
    { 
     // add a record to a table on mysql database 
    } 
} 

class OracleTable implements DbTable 
{ 
    public function create($array) 
    { 
     // add a record to a table on oracle database 
    } 
} 

class TableFactory 
{ 
    private $dbTypeConfig = 'mysql'; 

    public function createTable() 
    { 
     if ($this->dbTypeConfig == 'mysql') { 
      return new MySqlTable(); 
     } elseif ($this->dbTypeConfig == 'oracle') { 
      return new OracleTable(); 
     } 
     return null; 
    } 
} 
0

prosta konstrukcja fabryczna Wzorzec nie należą do Gangs of Four. Prosty wzór fabryczny jest jednym z tych, który zwraca instancję jednej z kilku możliwych klas, w zależności od dostarczonych danych. Oznacza to, że zwracane klasy mają tę samą klasę nadrzędną i metody, ale każda z nich wykonuje zadanie inaczej dla różnego rodzaju danych. Here is the complete post with real world example

Powiązane problemy