wzór fabryczny
![Sean Bradley](https://miro.medium.com/fit/c/96/96/1*c0mq4I7USQauCiOsFM589g.png)
podczas tworzenia kodu można tworzyć instancje obiektów bezpośrednio w metodach lub klasach. Chociaż jest to całkiem normalne, możesz dodać dodatkową abstrakcję między utworzeniem obiektu a miejscem, w którym jest on używany w projekcie.
możesz użyć wzorca fabrycznego, aby dodać dodatkową abstrakcję. Wzór fabryczny jest jednym z najłatwiejszych do zrozumienia i wdrożenia wzorców.
dodanie dodatkowej abstrakcji pozwoli Ci również dynamicznie wybierać klasy do tworzenia instancji w oparciu o jakąś logikę.
przed abstrakcją twoja klasa lub Metoda bezpośrednio utworzy konkretną klasę. Po dodaniu fabrycznej abstrakcji, konkretna klasa jest teraz tworzona poza bieżącą klasą / metodą, a teraz w podklasie.
wyobraź sobie aplikację do projektowania domów, a dom ma już domyślnie dodane krzesło na podłodze. Dodając wzór fabryczny, możesz dać użytkownikowi możliwość wyboru różnych krzeseł i liczby w czasie pracy. Zamiast sztywnego zakodowania krzesła w projekcie, gdy się zaczęło, użytkownik ma teraz możliwość wyboru.
dodanie tej dodatkowej abstrakcji oznacza również, że komplikacje związane z tworzeniem dodatkowych obiektów mogą być teraz ukryte przed klasą lub metodą, która jej używa.
ta separacja sprawia, że kod jest łatwiejszy do odczytania i udokumentowania.
wzorzec fabryczny polega tak naprawdę na dodaniu dodatkowej abstrakcji między tworzeniem obiektu a miejscem jego użycia. Daje to dodatkowe opcje, które można łatwiej rozszerzyć w przyszłości.
- Concrete Creator: aplikacja kliencka, klasa lub metoda wywołująca Creator (metoda Fabryczna).
- Interfejs produktu: interfejs opisujący atrybuty i metody, których fabryka będzie potrzebować w celu utworzenia produktu końcowego / obiektu.
- twórca: Klasa Fabryczna. Deklaruje metodę fabryczną, która zwróci żądany od niej obiekt.
- wyrób betonowy: obiekt wrócił z fabryki. Obiekt implementuje interfejs produktu.
schemat fabryczny UML
![](https://miro.medium.com/max/60/1*mMclIuCego8N-OT8K0sGzQ.png?q=20)
kod źródłowy
w tym przykładzie koncepcyjnym klient chce obiekt o nazwie b
zamiast tworzyć b
bezpośrednio w kliencie, prosi twórcę (fabrykę) o obiekt.
fabryka wyszukuje odpowiednią klasę używając jakiejś logiki z atrybutów żądania. Następnie prosi podklasę o utworzenie instancji nowego obiektu, który następnie zwraca jako odniesienie do klienta z prośbą o niego.
./factory/factory_concept.py
"""
The Factory Pattern Concept
https://sbcode.net/python/factory/#factoryfactory_conceptpy
"""from abc import ABCMeta, abstractmethodclass IProduct(metaclass=ABCMeta):
"A Hypothetical Class Interface (Product)" @staticmethod
@abstractmethod
def create_object():
"An abstract interface method"class ConcreteProductA(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductA" def create_object(self):
return selfclass ConcreteProductB(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductB" def create_object(self):
return selfclass ConcreteProductC(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductC" def create_object(self):
return selfclass Creator:
"The Factory Class" @staticmethod
def create_object(some_property):
"A static method to get a concrete product"
if some_property == 'a':
return ConcreteProductA()
if some_property == 'b':
return ConcreteProductB()
if some_property == 'c':
return ConcreteProductC()
return None# The Client
PRODUCT = Creator().create_object('b')
print(PRODUCT.name)
Wyjście
python ./factory/factory_concept.py
ConcreteProductB
przegląd wzorców fabrycznych
przykładowy przypadek użycia
odwiedź fabryczne wzorce projektowe w Pythonie (sbcode.net) dla przykładowego przypadku użycia wzorca fabrycznego.
przykładowy przypadek użycia to interfejs użytkownika, w którym użytkownik może wybierać z menu elementów, takich jak krzesła.
użytkownik otrzymał wybór za pomocą jakiegoś interfejsu nawigacyjnego i nie wiadomo, jaki wybór lub ile użytkownik dokona, dopóki aplikacja nie zostanie faktycznie uruchomiona i użytkownik zacznie z niej korzystać.
tak więc, gdy użytkownik wybrał krzesło, fabryka pobiera pewną właściwość związaną z tym wyborem, taką jak ID, typ lub inny atrybut, a następnie decyduje, która odpowiednia podklasa ma zostać utworzona, aby zwrócić odpowiedni obiekt.
![](https://miro.medium.com/freeze/max/60/1*8ygaRzNzTVXEjrSIK-WDXA.gif?q=20)
Zobacz powyższy gif, aby uzyskać bardzo graficzny przykład rzeczywistego świata użycia wzorca fabrycznego do zwracania obiektów krzesła. Panel po lewej stronie zawiera krzesła, a kiedy przeciągasz i upuszczasz krzesło na panel po prawej stronie, dzwoni do fabryki krzeseł, aby zwrócić mu krzesło.
wzór fabryczny
podsumowanie
- wzorzec fabryczny jest interfejsem, który odkłada tworzenie końcowego obiektu na podklasę.
- wzorzec fabryczny polega na wstawianiu innej warstwy/abstrakcji pomiędzy tworzeniem obiektu a miejscem, w którym jest on faktycznie używany.
- nie wiadomo, co lub ile obiektów będzie trzeba utworzyć do czasu uruchomienia.
- chcesz zlokalizować wiedzę o specyfice tworzenia instancji danego obiektu do podklasy, aby Klient nie musiał martwić się o szczegóły.
- chcesz utworzyć zewnętrzny framework, który aplikacja może importować/odwoływać się, i ukryć szczegóły specyfiki związanej z tworzeniem końcowego obiektu/produktu.
- unikalnym czynnikiem, który definiuje wzorzec fabryki, jest to, że twój projekt odkłada teraz tworzenie obiektów do podklasy, do której fabryka go delegowała.
wzorce projektowe w Pythonie (Książka)
czasami po prostu chcesz wyłączyć komputer i czytać z książki. Tak więc, ten wzór, plus wszystkie inne wzory GoF są omówione w moich wzorcach projektowych w Python book ASIN B08XLJ8Z2J