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.
Das Prototypmuster (Prototypmuster) ist eines der Entwurfsmuster, die sich auf die in der Softwareentwicklung verwendete Generierung beziehen. Wird verwendet, wenn der erstellte Objekttyp eine (typische) Prototypinstanz ist, wobei dieser Prototyp dupliziert wird, um ein neues Objekt zu erstellen.
Dieses Muster wird für die folgenden Zwecke verwendet.
Um dieses Muster zu implementieren, deklarieren Sie eine abstrakte Basisklasse, die die reine virtuelle Methode clone () angibt. Alle Klassen, die die Fähigkeit "polymorpher Konstruktoren" erfordern, leiten sich von abstrakten Basisklassen ab und implementieren clone () -Operationen.
UML class and sequence diagram UML class diagram
(Das Obige wird aus Wikipedia zitiert)
Das "Prototyp" -Muster besteht darin, eine andere Instanz aus einer Instanz zu erstellen, indem die Instanz kopiert wird, anstatt eine Instanz aus der Klasse zu erstellen. Die Vorteile der Verwendung des Prototypmusters werden auf Seite 66 des Buches "Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden" beschrieben. (1) Wenn es zu viele Typen gibt, um sie in einer Klasse zusammenzustellen (2) Wenn es schwierig ist, eine Instanz aus einer Klasse zu erstellen (3) Wenn Sie das Framework und die generierte Instanz trennen möchten
Wenn es Anwendungsfälle gibt, die eine große Anzahl von Instanzen generieren, führt dies zu einer Reduzierung der Overhead-Verarbeitung im Zusammenhang mit der Instanzerstellung?
Eigentlich möchte ich ein Beispielprogramm ausführen, das das Prototypmuster verwendet, und das folgende Verhalten überprüfen.
$ python Main.py
"Hello World"
-------------
***************
* Hello World *
***************
///////////////
/ Hello World /
///////////////
Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/Prototype
--Verzeichnisaufbau
.
├── Main.py
└── framework
├── __init__.py
├── decoprototype
│ ├── __init__.py
│ ├── message_box_prototype.py
│ └── underline_pen_prototype.py
├── manager.py
└── prototype.py
Die Rolle "Prototyp" definiert die Schnittstelle zum Kopieren (Duplizieren) einer Instanz, um eine neue Instanz zu erstellen. Im Beispielprogramm übernimmt die Klasse "Prototype" diese Rolle.
framework/prototype.py
from abc import ABCMeta, abstractmethod
class Prototype(metaclass=ABCMeta):
@abstractmethod
def use(self, s):
pass
@abstractmethod
def createClone(self):
pass
Die Rolle "ConcretePrototype" implementiert tatsächlich die Methode zum Kopieren einer Instanz und zum Erstellen einer neuen. Im Beispielprogramm übernehmen die Klassen "UnderlinePen" und "MessageBox" diese Rolle.
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
Die Rolle "Client" erstellt eine neue Instanz mit der Methode, mit der die Instanz kopiert wird. Im Beispielprogramm übernehmen die Klasse "Manager" und die Methode "startMain" diese Rolle.
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())
Recommended Posts