wzór fabryczny

Sean Bradley
Sean Bradley

Obserwuj

Apr 9, 2019 · 4 min czytać

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

wzór fabryczny Diagram UML

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.

przykład rzeczywistego świata użycia wzorca fabrycznego

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