Wzorzec fabryczny w Pythonie [zamknięty]

Obecnie implementuję Factory design pattern w Pythonie i mam kilka pytań.

  1. Czy Jest jakiś sposób, aby zapobiec bezpośredniej inicjacji rzeczywistych klas konkretnych? Na przykład, jeśli mam VehicleFactory, która produkuje pojazdy, chcę, aby użytkownicy po prostu korzystali z tej fabryki i zapobiegali przypadkowemu stworzeniu bezpośrednio Car() Lub Truck (). Mogę wrzucić wyjątek w init () być może, ale oznaczałoby to również, że fabryka nie może stworzyć przykład...

  2. Teraz wydaje mi się, że fabryki zaczynają uzależniać. Wygląda na to, że wszystko powinno stać się fabryką, aby gdy zmienię wewnętrzną implementację, kody klienta nie ulegną zmianie. Interesuje mnie, kiedy istnieje rzeczywista potrzeba korzystania z fabryk, a kiedy nie jest to właściwe do korzystania. Na przykład, mogę mieć klasę okien i jest tylko jeden z tego typu teraz (nie PlasticWindow, ReinforcedWindow lub coś w tym stylu). W takim przypadku, czy powinienem użyć Fabryka dla klienta, aby wygenerować okno, na wypadek, gdybym mógł dodać więcej typów okien w przyszłości?

  3. Zastanawiam się tylko, czy jest zwykły sposób na dzwonienie do fabryk. Na przykład teraz nazywam moją fabrykę pojazdów pojazdami, więc kody będą podobne do pojazdów.create(...). Widzę wiele samouczków robiących to jak VehicleFactory, ale uważam, że jest zbyt długi i trochę eksponuje implementację.

EDIT: co miałem na myśli mówiąc " exposes wdrożenie " polega na tym, że pozwala ludziom wiedzieć, że jest to fabryka. Czułem, że Klient nie musi wiedzieć, że to fabryka, ale raczej jako jakaś klasa, która może zwrócić obiekty dla ciebie(co jest oczywiście fabryką, ale może nie ma potrzeby, aby wyraźnie powiedzieć klientom, że?). Wiem, że kody soure są łatwo ujawniane, więc nie miałem na myśli "ujawniania sposobu implementacji funkcjonalności w kodach źródłowych".

Dzięki!

Author: chaindriver, 2010-08-18

3 answers

  1. nie ujawniaj klasy(na przykład Uczyń ją prywatną __MyClass lub oczywistym, że nie chcesz jej używać bezpośrednio _MyClass). W ten sposób można go utworzyć tylko za pomocą funkcji fabrycznej.
  2. być może powinieneś przejrzeć użycie argumentów słów kluczowych i dziedziczenie. Wygląda na to, że możesz przeoczyć te, które ogólnie zmniejszą Twoją zależność od złożonych fabryk (szczerze mówiąc, rzadko potrzebowałem fabryk).
  3. w Pythonie nie da się łatwo zabezpieczyć przed ujawnieniem implementacja jest sprzeczna z Zen Pythona . (To samo w każdym języku, zdeterminowana osoba może w końcu dostać to, czego chce). Co najwyżej powinieneś starać się upewnić, że użytkownik Twojego kodu nie zrobi przypadkowo źle, ale nigdy nie przypuszczaj, co użytkownik końcowy może zdecydować się osiągnąć za pomocą Twojego kodu. Nie rób z niego zaciemnionego i trudnego do pracy.
 10
Author: Matt Joiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 10:59:04

Bądź Pythoniczny. Nie komplikuj kodu za pomocą rozwiązań języka "enterprise" (takich jak Java), które dodają niepotrzebnych poziomów abstrakcji.

Twój kod powinien być prosty i intuicyjny. Nie powinieneś delegować do innej klasy, aby utworzyć instancję innej.

 22
Author: Humphrey Bogart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 10:39:15

Czy Jest jakiś sposób, aby zapobiec bezpośredniej inicjacji rzeczywistych klas konkretnych?

Dlaczego? Czy Twoi programiści są złymi socjopatami, którzy odmawiają przestrzegania zasad? Jeśli dostarczysz fabrykę - a fabryka zrobi to, czego ludzie potrzebują - wtedy będą z niej korzystać. Nie można niczego" zapobiec". Pamiętaj. Tu Python. mają źródło.

Czy powinienem użyć fabryki dla Klienta do wygenerowania okna, na wypadek gdybym mógł dodać więcej rodzaje okien w przyszłości?

Meh. Ani dobre, ani złe. Zarządzanie wszystkimi szczegółami hierarchii klas i fabryki może być kłopotliwe. Dodanie fabryki nie jest trudne. To jest Python -- masz wszystkie źródła przez cały czas -- możesz użyć grep, aby znaleźć konstruktor klasy i zastąpić go fabryką, gdy zajdzie taka potrzeba.

Ponieważ możesz użyć grep, aby znaleźć i naprawić swoje błędy, nie musisz wstępnie planować tego typu rzeczy tak bardzo, jak to możliwe w Javie lub C++.

Widzę wiele samouczków robiących to jak VehicleFactory, ale uważam, że jest zbyt długi i trochę eksponuje implementację.

"Za Długo"? Jest używany tak rzadko, że nie ma znaczenia. Używaj długich Imion ... to pomaga innym zrozumieć, co robisz. To nie jest Code Golf, gdzie wygrywa najmniej naciśnięć klawiszy.

"ujawnia realizację"? Po pierwsze, nic nie ujawnia. Po drugie, to jest Python -- masz wszystkie źródła przez cały czas -- wszystko jest już odsłonięty.

Przestań myśleć o zapobieganiu i prywatności. To nie pomaga.
 5
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 11:00:24