Fabriksmønster
når du udvikler kode, kan du instantiere objekter direkte i metoder eller i klasser. Selvom dette er helt normalt, kan du tilføje en ekstra abstraktion mellem oprettelsen af objektet og hvor det bruges i dit projekt.
du kan bruge Fabriksmønsteret til at tilføje den ekstra abstraktion. Fabriksmønsteret er et af de nemmeste mønstre at forstå og implementere.
tilføjelse af en ekstra abstraktion giver dig også mulighed for dynamisk at vælge klasser til instantiering baseret på en slags logik.
før abstraktionen ville din klasse eller metode direkte oprette en konkret klasse. Efter at have tilføjet fabriksabstraktionen oprettes betonklassen nu uden for den nuværende klasse/metode og nu i en underklasse.
Forestil dig en ansøgning om design af huse, og huset har som standard en stol, der allerede er tilføjet på gulvet. Ved at tilføje fabriksmønsteret kan du give brugeren mulighed for at vælge forskellige stole, og hvor mange på runtime. I stedet for at stolen er hårdt kodet ind i projektet, da det startede, har brugeren nu mulighed for at vælge.
tilføjelse af denne ekstra abstraktion betyder også, at komplikationerne ved at instantiere ekstra objekter nu kan skjules fra den klasse eller metode, der bruger den.
denne adskillelse gør også din kode lettere at læse og dokumentere.
Fabriksmønsteret handler virkelig om at tilføje den ekstra abstraktion mellem objektoprettelsen og hvor den bruges. Dette giver dig ekstra muligheder, som du lettere kan udvide i fremtiden.
- konkret skaber: klientapplikationen, klassen eller metoden, der kalder skaberen (Fabriksmetode).
- produktgrænseflade: grænsefladen, der beskriver de attributter og metoder, som fabrikken vil kræve for at skabe det endelige produkt/objekt.
- skaber: Fabriksklassen. Erklærer fabriksmetoden, der returnerer det objekt, der anmodes om fra det.
- betonprodukt: objektet returneres fra fabrikken. Objektet implementerer produktgrænsefladen.
fabrik UML Diagram
kildekode
i dette koncepteksempel ønsker klienten et objekt med navnetb
i stedet for at oprette b
direkte i klienten, beder den skaberen (fabrikken) om objektet i stedet.
fabrikken finder den relevante klasse ved hjælp af en slags logik fra anmodningens attributter. Det beder derefter underklassen om at instantiere det nye objekt, som det derefter vender tilbage som en reference tilbage til klienten, der beder om det.
./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)
udgang
python ./factory/factory_concept.py
ConcreteProductB
Fabriksmønster oversigt Video
eksempel Use Case
besøg Factory-Design mønstre i Python (sbcode.net) for et eksempel brug tilfælde af fabrikken mønster.
et eksempel på brug er en brugergrænseflade, hvor brugeren kan vælge fra en menu med emner, såsom stole.
brugeren har fået et valg ved hjælp af en slags navigationsgrænseflade, og det er ukendt, hvilket valg, eller hvor mange brugeren vil tage, indtil applikationen faktisk kører, og brugeren begynder at bruge den.
så når brugeren valgte stolen, tager fabrikken derefter nogle egenskaber involveret i dette valg, såsom et ID, en Type eller en anden attribut og beslutter derefter, hvilken relevant underklasse der skal instantieres for at returnere det relevante objekt.
se ovenstående gif for en meget grafisk eksempel på en virkelige verden eksempel på at bruge fabrikken mønster til at returnere stol objekter. Panelet til venstre indeholder stole, og når du trækker og slipper en stol til panelet til højre, kalder det Stolfabrikken for at returnere den til en stol.
brug af Fabriksmønster-case Video
Resume
- Fabriksmønsteret er en grænseflade, der udsætter oprettelsen af det endelige objekt til en underklasse.
- Fabriksmønsteret handler om at indsætte et andet lag/abstraktion mellem instantiering af et objekt og hvor i din kode det faktisk bruges.
- det er ukendt, hvad eller hvor mange objekter der skal oprettes indtil runtime.
- du vil lokalisere viden om detaljerne ved at instantiere et bestemt objekt til underklassen, så klienten ikke behøver at være bekymret for detaljerne.
- du vil oprette en ekstern ramme, som et program kan importere/henvise til, og skjule detaljerne i de detaljer, der er involveret i oprettelsen af det endelige objekt/produkt.
- den unikke faktor, der definerer Fabriksmønsteret, er, at dit projekt nu udsætter oprettelsen af objekter til den underklasse, som fabrikken havde delegeret det til.
Design mønstre i Python (bog)
nogle gange vil du bare slukke for din computer og læse fra en bog. Så dette mønster, plus alle andre GoF mønstre diskuteres i mit Design mønstre i Python bog ASIN B08H8H2J