Apprenez le modèle de conception "Méthode d'usine" en Python

En tant que matériel d'apprentissage des modèles de conception du GoF, le livre «Introduction aux modèles de conception appris dans le langage Java augmenté et révisé» semble être utile. Cependant, comme les exemples repris sont basés sur JAVA, j'ai essayé la même pratique avec Python pour approfondir ma compréhension.

■ Méthode d'usine

Le modèle de méthode d'usine est l'un des modèles de conception définis par GoF (Gang of Four). Le modèle de méthode d'usine vise à expulser la création d'objet spécifique à l'application vers des sous-classes et à augmenter la réutilisabilité des classes en remplaçant les constructeurs d'autres classes par leurs propres méthodes qui peuvent être remplacées par des sous-classes. Aussi connu sous le nom de modèle Virtual Constructor. UML class diagram W3sDesign_Factory_Method_Design_Pattern_UML.jpg 1000px-Factory_Method_UML_class_diagram.svg.png (Ce qui précède est cité sur Wikipedia)

□ Mémorandum

Le modèle de comportement Template Method est une superclasse qui décrit le traitement et les sous-classes qui déterminent le traitement spécifique. Il semble que le modèle Méthode d'usine est celui qui applique ce modèle Méthode modèle à la scène de création d'une instance.

■ Exemple de programme "Méthode d'usine"

Le modèle de méthode d'usine semble avoir les caractéristiques suivantes.

--Déterminer comment créer une instance côté superclasse

En faisant cela, il semble que le cadre de création d'une instance et la classe réelle de création d'une instance peuvent être considérés séparément. En fait, j'aimerais utiliser le modèle de méthode d'usine pour exécuter un exemple de programme avec le thème «une usine qui fabrique des cartes d'identification (cartes d'identité)» et vérifier l'opération suivante.

--Créez trois cartes d'identité, «Hiroshi Yuki», «Tomura» et «Hanako Sato». --Utilisez 3 cartes d'identité: Hiroshi Yuki", Tomura, Hanako Sato`

$ python Main.py 
I'll create Hiroshi Yuki's card
I'll create Tomura's card
I'll create Hanako Sato's card
I'll use Hiroshi Yuki's card
I'll use Tomura's card
I'll use Hanako Sato's card

Si vous exécutez simplement l'exemple de programme, vous n'êtes pas sûr de ce que vous voulez faire. Ensuite, vérifions les détails de l'exemple de programme.

■ Détails de l'exemple de programme

Un code similaire a été téléchargé dans le référentiel Git. https://github.com/ttsubo/study_of_design_pattern/tree/master/FactoryMethod

.
├── Main.py
└── framework
    ├── __init__.py
    ├── factory.py
    └── idcardfactory
        ├── __init__.py
        └── id_card_factory.py

(1) Rôle du produit

Le rôle Product définit l'interface que l'instance doit avoir. Dans l'exemple de programme, la classe Product remplit ce rôle.

framework/factory.py


from abc import ABCMeta, abstractmethod

... (snip)

class Product(metaclass=ABCMeta):
    @abstractmethod
    def use(self):
        pass

(2) Le rôle du créateur

Dans le rôle de "Créateur", il est responsable de la génération du "Produit". Je ne sais rien du rôle Concrete Product qui est réellement généré. De plus, le rôle Creator fournit des méthodes pour créer chaque partie de l'instance. Dans l'exemple de programme, la classe Factory remplit ce rôle.

framework/factory.py


from abc import ABCMeta, abstractmethod

class Factory(metaclass=ABCMeta):
    def create(self, owner):
        p = self.createProduct(owner)
        self.registerProduct(p)
        return p

    @abstractmethod
    def createProduct(self, owner):
        pass

    @abstractmethod
    def registerProduct(self, product):
        pass

... (snip)

(3) Rôle du produit en béton

Le rôle ConcreteProduct est une classe qui implémente l'interface pour le rôle Product. La méthode qui sera appelée après l'instanciation réelle est définie ici. Dans l'exemple de programme, la classe ʻIDCardProduct` remplit ce rôle.

framework/id_card_factory.py


from framework.factory import Factory, Product

... (snip)

class IDCardProduct(Product):
    def __init__(self, owner):
        self.owner = owner
        print("I'll create {0}'s card".format(self.owner))

    def use(self):
        print("I'll use {0}'s card".format(self.owner))

(4) Le rôle de Concrete Creator

Le rôle ConcreteCreator est une classe qui implémente l'interface pour le rôle Creator. Déterminez la classe pour fabriquer un produit spécifique. Dans l'exemple de programme, la classe ʻIDCardFactory` remplit ce rôle.

framework/id_card_factory.py


from framework.factory import Factory, Product

class IDCardFactory(Factory):
    def __init__(self):
        self.owners = []

    def createProduct(self, owner):
        return IDCardProduct(owner)

    def registerProduct(self, product):
        self.owners.append(product.owner)

... (snip)

(5) Le rôle du client

Dans l'exemple de programme, la méthode startMain remplit ce rôle.

Main.py


from framework.idcardfactory.id_card_factory import IDCardFactory

def startMain(factoryObject):
    card1 = factoryObject.create("Hiroshi Yuki")
    card2 = factoryObject.create("Tomura")
    card3 = factoryObject.create("Hanako Sato")
    card1.use()
    card2.use()
    card3.use()

if __name__ == "__main__":
    startMain(IDCardFactory())

■ URL de référence

Recommended Posts

Apprenez le modèle de conception "Méthode d'usine" en Python
Apprenez le modèle de conception "Abstract Factory" avec Python
Apprenez le modèle de conception "Méthode de modèle" en Python
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Builder" avec Python
Apprenez le modèle de conception "Flyweight" en Python
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Apprenez le modèle de conception "Commande" en Python
Apprenez le modèle de conception "Bridge" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Apprenez le modèle de conception "Iterator" avec Python
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "État" en Python
Apprenez le modèle de conception "Adapter" avec Python
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Design Pattern #Factory, méthode
Apprenez le modèle de conception "Singleton" avec Python
Apprenez le modèle de conception "Façade" avec Python
Python Design Pattern - Méthode de modèle
Implémenter le modèle Singleton en Python
Motif singleton en Python
Modèle de visiteur en Python
[Gang of Four] Apprentissage des modèles de conception - Méthode d'usine
J'ai essayé la méthode des moindres carrés en Python
Pour remplacer dynamiquement la méthode suivante en python
Méthode Simplex (méthode unique) en Python
Design Pattern #Template, méthode
Méthode privée en python
Essayez d'implémenter la méthode Monte Carlo en Python
J'ai écrit un modèle de conception dans l'édition Kotlin Factory
Déterminer le seuil à l'aide de la méthode P-tile en python
Implémentation de la méthode k-voisinage en python à partir de scikit learn
Trouver des erreurs en Python
Modèles de conception en Python: introduction
Modèle de méthode de modèle en Java
Suppression des substitutions de méthode en Python
Comment utiliser la méthode __call__ dans la classe Python
Python dans le navigateur: la recommandation de Brython
Enregistrez le fichier binaire en Python
Frappez l'API Sesami en Python
Obtenez le chemin du bureau en Python
Obtenez le chemin du script en Python
Dans la commande python, python pointe vers python3.8
Implémentation de la méthode de propagation d'étiquettes en Python
Simuler la méthode Monte Carlo en Python
Accédez à l'API Web en Python
Méthode Hash (méthode d'adresse ouverte) en Python
J'ai écrit la file d'attente en Python
Calculer le mois précédent en Python
Examiner la classe d'un objet avec python
Obtenez le chemin du bureau en Python
Obtenez le nom d'hôte en Python