[GO] Lernen Sie das Entwurfsmuster "Builder" mit Python

Als Material zum Erlernen von GoF-Entwurfsmustern scheint das Buch "Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden" hilfreich zu sein. Da die aufgeführten Beispiele jedoch auf JAVA basieren, habe ich dieselbe Vorgehensweise mit Python versucht, um mein Verständnis zu vertiefen.

■ Builder

Das Builder-Muster (Builder-Muster) ist eines der von GoF (Gang of Four; 4 Banden) definierten Entwurfsmuster. Es ermöglicht die dynamische Objekterstellung durch Abstraktion des Objekterstellungsprozesses. UML class and sequence diagram W3sDesign_Builder_Design_Pattern_UML.jpg UML class diagram 2880px-Builder_UML_class_diagram.svg-2.png (Das Obige wird aus Wikipedia zitiert)

■ Beispielprogramm "Builder"

Da es schwierig ist, eine komplexe Struktur mit dem Builder-Muster auf einmal zusammenzusetzen, wird anscheinend jeder Teil, aus dem das Ganze besteht, im Voraus erstellt und eine Instanz mit der Struktur wird Schritt für Schritt zusammengesetzt. Eigentlich möchte ich versuchen, ein Beispielprogramm auszuführen, das ein "Dokument" mit dem Builder-Muster erstellt, und überprüfen, wie es funktioniert.

--Wenn im Nur-Modus betrieben, wird ein Dokument im Nur-Text-Format ausgegeben. --Wenn im HTML-Modus gearbeitet, wird eine HTML-Datei mit tabellarischen Links generiert.

(1) Versuchen Sie, im "normalen" Modus zu laufen

Verschieben wir zunächst den vom Dokument im Nur-Text-Format ausgegebenen Code.

$ python Main.py plain
======================
Greeting

*** From the morning to the afternoon ***
- Good morning
- Hello
*** In the evening ***
- Good evening
- Good night
- Good bye
======================

Es wurde ein sogenanntes Nur-Text-Dokument ausgegeben.

(2) Versuchen Sie, den HTML-Modus zu verschieben

Lassen Sie uns als Nächstes den Code ausführen, der eine ** tabellenbasierte ** Webseite erstellt.

$ python Main.py html
[Greeting.html] was created.

Eine Datei mit dem Namen "Greeting.html" wurde generiert. Als ich das Erscheinungsbild mit einem Webbrowser überprüfte, sah es so aus. tablehtml.png

■ Details zum Beispielprogramm

Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/Builder

--Verzeichnisaufbau

.
├── Main.py
└── builder
    ├── __init__.py
    ├── builder.py
    ├── director.py
    ├── htmlbuilder
    │   ├── __init__.py
    │   └── html_builder.py
    └── textbuilder
        ├── __init__.py
        └── text_builder.py

(1) Die Rolle des Baumeisters

Die Rolle "Builder" definiert die Schnittstelle zum Erstellen einer Instanz. Die Rolle "Builder" bietet Methoden zum Erstellen jedes Teils der Instanz. Im Beispielprogramm übernimmt die Builder-Klasse diese Rolle.

builder/builder.py


from abc import ABCMeta, abstractmethod

class Builder(metaclass=ABCMeta):
    @abstractmethod
    def makeTitle(self, title):
        pass

    @abstractmethod
    def makeString(self, str):
        pass

    @abstractmethod
    def makeItems(self, items):
        pass

    @abstractmethod
    def close(self):
        pass

(2) Die Rolle des Betonbauers

Die Rolle "ConcreteBuilder" ist eine Klasse, die die Schnittstelle für die Rolle "Builder" implementiert. Hier wird die in der eigentlichen Instanziierung aufgerufene Methode definiert. Es bietet auch eine Methode, um das Endergebnis zu erhalten. Im Beispielprogramm übernehmen die Klasse "TextBuilder" und die Klasse "HTMLBuilder" diese Rolle.

builder/text_builder.py


from builder.builder import Builder

class TextBuilder(Builder):
    def __init__(self):
        self.buffer = []

    def makeTitle(self, title):
        self.buffer.append("======================\n")
        self.buffer.append(title + "\n")
        self.buffer.append("\n")

    def makeString(self, str):
        self.buffer.append("*** " + str + " ***" + "\n")

    def makeItems(self, items):
        for i in items:
            self.buffer.append("- " + i + "\n")

    def close(self):
        self.buffer.append("======================\n")

    def getResult(self):
        return ''.join(self.buffer)

builder/html_builder.py


from builder.builder import Builder

class HTMLBuilder(Builder):
    def __init__(self):
        self.buffer = []
        self.filename = ""
        self.f = None
        self.makeTitleCalled = False

    def makeTitle(self, title):
        self.filename = title+".html"
        self.f = open(self.filename, "w")
        self.f.write("<html><head><title>"+title+"</title></head></html>")
        self.f.write("<h1>"+title+"</h1>")
        self.makeTitleCalled = True

    def makeString(self, str):
        if not self.makeTitleCalled:
            raise RuntimeError
        self.f.write("<p>"+str+"</p>")

    def makeItems(self, items):
        if not self.makeTitleCalled:
            raise RuntimeError
        self.f.write("<ul>")
        for i in items:
            self.f.write("<li>"+i+"</li>")
        self.f.write("</ul>")

    def close(self):
        if not self.makeTitleCalled:
            raise RuntimeError
        self.f.write("</body></html>")
        self.f.close()

    def getResult(self):
        return self.filename

(3) Die Rolle des Direktors

Die Rolle "Director" erstellt eine Instanz über die Rollenschnittstelle "Builder". Es basiert nicht auf der Rolle "ConcreteBuilder". Verwenden Sie nur die Methoden der Rolle "Builder", damit sie unabhängig von der Rolle "ConcreteBuilder" einwandfrei funktioniert. Im Beispielprogramm übernimmt die Klasse "Director" diese Rolle.

builder/director.py


class Director(object):
    def __init__(self, builder):
        self.__builder = builder

    def construct(self):
        self.__builder.makeTitle("Greeting")
        self.__builder.makeString("From the morning to the afternoon")
        self.__builder.makeItems(["Good morning", "Hello"])
        self.__builder.makeString("In the evening")
        self.__builder.makeItems(["Good evening", "Good night", "Good bye"])
        self.__builder.close()

(4) Die Rolle des Kunden

Es ist eine Rolle, die die Rolle des Builders verwendet. Im Beispielprogramm übernimmt die Methode "startMain" diese Rolle.

Main.py


import sys

from builder.director import Director
from builder.textbuilder.text_builder import TextBuilder
from builder.htmlbuilder.html_builder import HTMLBuilder

def startMain(opt):
    if opt == "plain":
        builder = TextBuilder()
        director = Director(builder)
        director.construct()
        result = builder.getResult()
        print(result)
    elif opt == "html":
        builder = HTMLBuilder()
        director = Director(builder)
        director.construct()
        result = builder.getResult()
        print("[" + result + "]" + " was created.")


if __name__ == "__main__":
    startMain(sys.argv[1])

■ Referenz-URL

Recommended Posts

Lernen Sie das Entwurfsmuster "Builder" mit Python
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Designmuster "Flyweight" in Python
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Lernen Sie das Entwurfsmuster "Befehl" in Python
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Lernen Sie das Entwurfsmuster "Bridge" mit Python
Lernen Sie das Entwurfsmuster "Mediator" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
Lernen Sie das Entwurfsmuster "Iterator" mit Python
Lernen Sie das Entwurfsmuster "Strategie" mit Python
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Adapter" mit Python
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Designmuster "Facade" mit Python
Implementieren Sie das Singleton-Muster in Python
Entwurfsmuster #Builder
Singleton-Muster in Python
Besuchermuster in Python
Finde Fehler in Python
Ich habe ein Designmuster in der Kotlin Builder Edition geschrieben
Entwurfsmuster in Python: Einführung
Python Design Pattern - Template-Methode
Abrufen der arXiv-API in Python
Python im Browser: Brythons Empfehlung
Speichern Sie die Binärdatei in Python
Klicken Sie in Python auf die Sesami-API
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Skriptpfad in Python
Im Python-Befehl zeigt Python auf Python3.8
Klicken Sie auf die Web-API in Python
Ich habe die Warteschlange in Python geschrieben
Berechnen Sie den Vormonat in Python
Untersuchen Sie die Klasse eines Objekts mit Python
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Hostnamen in Python
Greifen Sie mit Python auf die Twitter-API zu
Der erste Schritt von Python Matplotlib
Ich habe den Stack in Python geschrieben
Beherrsche das schwache Ref-Modul in Python
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
Laden Sie das Remote-Python-SDK mit IntelliJ
Versuchen Sie es mit der Wunderlist-API in Python
Überprüfen Sie das Verhalten des Zerstörers in Python
[Python Kivy] Über das Ändern des Designthemas
Versuchen Sie, die Kraken-API mit Python zu verwenden
Lernen Sie die Grundlagen, während Sie Python-Variablen berühren
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Nehmen Sie die logische Summe von List in Python (Zip-Funktion)
GoF-Entwurfsmuster aus dem Problem 2. Struktur
Zeigen Sie Python 3 im Browser mit MAMP an