Apprenez le modèle de conception "Prototype" avec 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.

■ Prototype (modèle de prototype)

Le modèle de prototype (modèle de prototype) est l'un des modèles de conception liés à la génération utilisés dans le développement de logiciels. Utilisé lorsque le type d'objet créé est une instance de prototype (typique), dupliquant ce prototype pour créer un nouvel objet.

Ce modèle est utilisé aux fins suivantes.

Pour implémenter ce modèle, déclarez une classe de base abstraite qui spécifie la méthode clone () de la méthode virtuelle pure. Toutes les classes qui nécessitent la capacité de "constructeurs polymorphes" dérivent elles-mêmes de classes de base abstraites et implémentent des opérations clone ().

UML class and sequence diagram W3sDesign_Prototype_Design_Pattern_UML.jpg UML class diagram https---qiita-image-store.s3.ap-northeast-1.amazonaws.com-0-103595-3c90ab89-e715-587d-10eb-65490cb5be6c.png

(Ce qui précède est cité sur Wikipedia)

□ Mémorandum

Le modèle Prototype consiste à créer une autre instance à partir d'une instance en copiant l'instance au lieu de créer une instance à partir de la classe. Les avantages de l'utilisation du modèle Prototype sont décrits à la page 66 du livre" Introduction aux modèles de conception appris dans le langage Java augmenté et révisé ". (1) Lorsqu'il y a trop de types à assembler dans une classe (2) Lorsqu'il est difficile de créer une instance à partir d'une classe (3) Lorsque vous souhaitez séparer le framework et l'instance générée

Eh bien, s'il y a des cas d'utilisation qui génèrent un grand nombre d'instances, cela conduira-t-il à une réduction des frais généraux liés à la création d'instances?

■ Exemple de programme "Prototype"

Je voudrais exécuter un exemple de programme qui utilise le modèle Prototype et vérifier le comportement suivant.

--Afficher la chaîne de caractères soulignée --Afficher la chaîne de caractères entourée d'une bordure

$ python Main.py 
"Hello World"
-------------

***************
* Hello World *
***************

///////////////
/ Hello World /
///////////////

■ 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/Prototype

.
├── Main.py
└── framework
    ├── __init__.py
    ├── decoprototype
    │   ├── __init__.py
    │   ├── message_box_prototype.py
    │   └── underline_pen_prototype.py
    ├── manager.py
    └── prototype.py

(1) Le rôle du prototype

Le rôle Prototype définit l'interface de copie (duplication) d'une instance pour créer une nouvelle instance. Dans l'exemple de programme, la classe Prototype remplit ce rôle.

framework/prototype.py


from abc import ABCMeta, abstractmethod

class Prototype(metaclass=ABCMeta):
    @abstractmethod
    def use(self, s):
        pass

    @abstractmethod
    def createClone(self):
        pass

(2) Le rôle du prototype concret

Le rôle ConcretePrototype implémente en fait la méthode de copie d'une instance et de création d'une nouvelle. Dans l'exemple de programme, la classe ʻUnderlinePen et la classe MessageBox` remplissent ce rôle.

framework/decoprototype/underline_pen_prototype.py


import copy
from framework.prototype import Prototype

class UnderlinePen(Prototype):
    def __init__(self, ulchar):
        self.__ulchar = ulchar

    def use(self, s):
        length = len(s)
        line = self.__ulchar * (length + 2)

        print("\"{0}\"".format(s))
        print("{0}\n".format(line))

    def createClone(self):
        clone = copy.deepcopy(self)
        return clone

framework/decoprototype/message_box_prototype.py


import copy
from framework.prototype import Prototype

class MessageBox(Prototype):
    def __init__(self, decochar):
        self.__decochar = decochar

    def use(self, s):
        length = len(s)
        line = self.__decochar * (length + 4)

        print("{0}".format(line))
        print("{0} {1} {2}".format(self.__decochar, s, self.__decochar))
        print("{0}\n".format(line))

    def createClone(self):
        clone = copy.deepcopy(self)
        return clone

(3) Le rôle du client (utilisateur)

Le rôle Client crée une nouvelle instance en utilisant la méthode qui copie l'instance. Dans l'exemple de programme, la classe Manager et la méthode startMain remplissent ce rôle.

framework/manager.py


class Manager(object):
    def __init__(self):
        self.__showcase = {}

    def register(self, name, proto):
        self.__showcase[name] = proto

    def create(self, protoname):
        p = self.__showcase[protoname]
        return p.createClone()

Main.py


from framework.manager import Manager
from framework.decoprototype.underline_pen_prototype import UnderlinePen
from framework.decoprototype.message_box_prototype import MessageBox

def startMain(managerObject):
    upen = UnderlinePen("-")
    mbox = MessageBox("*")
    sbox = MessageBox("/")
    managerObject.register("strong message", upen)
    managerObject.register("warning box", mbox)
    managerObject.register("slash box", sbox)

    p1 = managerObject.create("strong message")
    p2 = managerObject.create("warning box")
    p3 = managerObject.create("slash box")
    p1.use("Hello World")
    p2.use("Hello World")
    p3.use("Hello World")

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

■ URL de référence

Recommended Posts

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 "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
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 "Abstract Factory" avec Python
Apprenez le modèle de conception "Méthode de modèle" en Python
Apprenez le modèle de conception "Méthode d'usine" en Python
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Apprenez le modèle de conception "Singleton" avec Python
Apprenez le modèle de conception "Façade" avec Python
Implémenter le modèle Singleton en Python
Motif singleton en Python
Modèle de visiteur en Python
Modèle de prototype en Java
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype
Trouver des erreurs en Python
Modèles de conception en Python: introduction
Python Design Pattern - Méthode de modèle
Obtenir l'API arXiv en 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
Accédez à l'API Web 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
Accéder à l'API Twitter avec Python
La première étape de Python Matplotlib
J'ai écrit la pile en Python
Maîtriser le module lowref en Python
Apprenez les bases de Python ① Débutants élémentaires
Charger le SDK Python distant avec IntelliJ
Essayez d'utiliser l'API Wunderlist en Python
Vérifiez le comportement du destroyer en Python
[Python Kivy] À propos de la modification du thème de conception
Essayez d'utiliser l'API Kraken avec Python
Apprenez les bases en touchant les variables python
Ecrire le test dans la docstring python
Prenez la somme logique de List en Python (fonction zip)
Modèle de conception du GoF à partir du problème 2. Structure
Afficher Python 3 dans le navigateur avec MAMP