[PYTHON] Design Pattern #Factory, méthode

J'ai pratiqué les modèles de conception afin de pouvoir écrire du code conscient du design. D'autres modèles de conception seront publiés fréquemment.

Préface

L'objectif principal est de comprendre quand, quoi et comment utiliser les modèles de conception. (Je suis nouveau en Java ou dans un langage à typage statique, et je n'ai pas une longue histoire de python, donc je pense qu'il y a des choses qui ne ressemblent pas à Pythonista. Si vous avez des suggestions, apprenez-moi s'il vous plaît.)

Cette fois, le modèle FactoryMethod pour la génération.

Qu'est-ce que la méthode d'usine?

Séparez l'interface de création d'objets et le rôle de création d'objets, remplacez les constructeurs d'autres classes par vos propres méthodes qui peuvent être écrasées par des sous-classes et laissez la création d'objets aux sous-classes pour améliorer la réutilisabilité des classes.

Aperçu

Cet exemple de programme est basé sur une usine qui fabrique des cartes d'identification (cartes d'identité). Il y a quatre classes ici.

Les classes Product et Factory appartiennent à un package appelé Framework. Ces deux classes agissent comme un cadre pour l'instanciation.

La classe ID et la classe IDCardFactory effectuent le fleshing réel. Ceux-ci appartiennent à un package appelé ID Card.

Diagramme de classe global

Framework/factory.py


from abc import ABCMeta, abstractmethod


class Factory(metaclass=ABCMeta):

    @abstractmethod
    def _create_product(self, owner):
        pass

    @abstractmethod
    def _register_product(self, product):
        pass

    def create(self, owner):
        self.__p = self._create_product(owner)
        self._register_product(self.__p)
        return self.__p

Le modèle de méthode modèle est utilisé ici. Le modèle de méthode de modèle consiste à "déterminer un vaste cadre de traitement dans la superclasse et déterminer le traitement spécifique dans la sous-classe".

Cette classe définit un vaste cadre de traitement et les sous-classes sont responsables de l'implémentation des méthodes create_product et register_product pour lesquelles un traitement spécifique n'a pas été déterminé.

La méthode create utilise à la fois les méthodes create_product et register_product pour créer une instance du "produit". Le modèle de méthode d'usine utilise le modèle de méthode de modèle pour l'instanciation.

Framework/product.py


from abc import ABCMeta, abstractmethod

class Product(metaclass=ABCMeta):

    @abstractmethod
    def use(self):
        pass

Seule la déclaration de l'utilisation de la méthode abstraite.

IDCard/idcard.py


from Framework.product import Product


class IDCard(Product):

    def __init__(self, owner):
        self.__owner = owner
        print(self.__owner + 'Créer une carte pour')

    def use(self):
        print(self.__owner + 'Utilisez la carte')

    def get_owner(self):
        return self.__owner

Définissez comme une sous-classe de la classe Product, créez un constructeur et définissez la méthode use et la méthode get_owner.

IDCard/idcard_factory.py


from Framework.factory import Factory
from IDCard.idcard import IDCard


class IDCardFactory(Factory):

    def __init__(self):
        self.__registed = []

    def _create_product(self, owner):
        return IDCard(owner)

    def _register_product(self, product):
        self.__registed.append(product.get_owner())

Implémentation des méthodes create_product et register_product. La méthode create_product crée une instance de la classe IDCard. La méthode register_product ajoute le propriétaire IDCard obtenu par la méthode get_owner aux propriétaires de la liste.

main.py


from IDCard.idcard_factory import IDCardFactory


def main():
    factory = IDCardFactory()
    card1 = factory.create('Hiroshi Yuki')
    card2 = factory.create('Tomura')
    card3 = factory.create('Hanako Sato')

    card1.use()
    card2.use()
    card3.use()

if __name__ == '__main__':
    main()

Résultat de sortie

Créer une carte pour Hiroshi Yuki
Créer une carte Tomura
Créer une carte pour Hanako Sato
J'utiliserai la carte d'Hiroshi Yuki
J'utiliserai la carte de Tomura
J'utiliserai la carte de Hanako Sato

Résumé

Puisque seule l'interface est spécifiée et que la sous-classe est en charge de la classe à instancier, il était possible d'accéder à la méthode de l'extérieur sans se soucier de l'implémentation interne.

référence

Recommended Posts

Design Pattern #Factory, méthode
Design Pattern #Template, méthode
[Gang of Four] Apprentissage des modèles de conception - Méthode d'usine
Apprenez le modèle de conception "Méthode d'usine" en Python
Python Design Pattern - Méthode de modèle
Modèle de conception #Builder
Modèle de conception #Adapter
Modèle de conception #Decorator
Modèle de conception #Observer
Modèle de conception #Facade
Modèle de conception #Strategy
Modèle de conception #Singleton
Modèle de conception #Proxy
[Gang of Four] Apprentissage des modèles de conception - Usine abstraite
Apprenez le modèle de conception "Abstract Factory" avec Python
Apprenez le modèle de conception "Méthode de modèle" en Python
[Explication détaillée] Modèle de méthode de modèle
[Gang of Four] Apprentissage des modèles de conception - Méthode du modèle
J'ai écrit un modèle de conception dans l'édition Kotlin Factory
Modèle de méthode de modèle en Java
Modèle de conception Oreore: variable glocale
[Gang of Four] Apprentissage des modèles de conception
Introduction d'une méthode de conception de contrôleur pilotée par les données
Résumé du modèle de conception Java GoF
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle abstrait Factory
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Builder" avec Python
[Gang of Four] Apprentissage des modèles de conception --Singleton
[Gang of Four] Apprentissage des modèles de conception - Décorateur
[Gang of Four] Apprentissage des modèles de conception - Visiteur
[Gang of Four] Apprentissage des modèles de conception - Médiateur
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
[Gang of Four] Apprentissage des modèles de conception - Itérateur
Modèle de conception du GoF à partir du problème 2. Structure
Apprenez le modèle de conception "Visiteur" avec 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
[Gang of Four] Apprentissage des modèles de conception - Façade
[Gang of Four] Apprentissage des modèles de conception - Composite
[Gang of Four] Apprentissage des modèles de conception - Prototype
Modèle de conception du GoF à partir du problème 1. Génération
Apprenez le modèle de conception "Iterator" avec Python
[Gang of Four] Apprentissage des modèles de conception --Mémento
[Gang of Four] Apprentissage des modèles de conception - État
[Gang of Four] Apprentissage des modèles de conception - Interprétation
[Gang of Four] Apprentissage des modèles de conception - Constructeur
Apprenez le modèle de conception «Stratégie» avec Python
[Gang of Four] Apprentissage des modèles de conception - Pont
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "Singleton" avec Python
Apprenez le modèle de conception "État" en Python
Apprenez le modèle de conception "Adapter" avec Python
[Gang of Four] Apprentissage des modèles de conception - Proxy
[Gang of Four] Apprentissage des modèles de conception - Stratégie
[Gang of Four] Apprentissage des modèles de conception - Adaptateur
Apprenez le modèle de conception "Façade" avec Python