Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Python-Version des einfachen Factory-Musters

Einführung in die Python-Version des einfachen Factory-Musters

黄舟
黄舟Original
2017-10-17 10:25:341961Durchsuche

In diesem Artikel wird hauptsächlich die Python-Version des einfachen Fabrikmusters im Detail vorgestellt, die einen gewissen Referenzwert hat.

Was ist das einfache Fabrikmuster?

Das Fabrikmuster hat eine sehr anschauliche Beschreibung. Die Klasse, die das Objekt erstellt, ist wie eine Fabrik, und die Objekte, die erstellt werden müssen, sind Produkte. Die Produkte werden in der Fabrik verarbeitet, die Menschen, die die Produkte verwenden, jedoch nicht Sie müssen sich um die Art und Weise kümmern, wie das Produkt hergestellt wird. Aus Sicht der Softwareentwicklung wird dadurch die Kopplung zwischen Modulen effektiv reduziert.
Die Funktion einer einfachen Factory besteht darin, ein Objekt zu instanziieren, ohne dass der Client wissen muss, zu welcher spezifischen Unterklasse das Objekt gehört. Die von einer einfachen Factory instanziierten Klassen haben dieselbe Schnittstelle oder Basisklasse. Wenn die Unterklasse relativ fest ist und nicht erweitert werden muss, kann eine einfache Factory verwendet werden. Beispielsweise ist die Datenbankproduktionsfabrik eine Anwendung einer einfachen Fabrik.
Der Vorteil der Verwendung einer einfachen Fabrik besteht darin, dass Benutzer entsprechende Klasseninstanzen gemäß Parametern erhalten können, wodurch eine direkte Instanziierung von Klassen vermieden und die Kopplung verringert wird Instanziierbare Typen sind: Bei der Kompilierung wurde festgestellt, dass beim Hinzufügen eines neuen Typs die Fabrik geändert werden muss, was nicht dem OCP-Prinzip (Open-Closed-Prinzip) entspricht. Eine einfache Factory muss alle zu generierenden Typen kennen und ist nicht für den Einsatz geeignet, wenn zu viele Unterklassen oder zu viele Unterklassenebenen vorhanden sind.

Einfache Factory-Pattern-Implementierung

Betrachten Sie ein Beispiel aus dem „Dahua Design Pattern“ unten:
Titel: Verwenden Sie eine beliebige objektorientierte Sprache, um A zu implementieren Taschenrechner-Konsolenprogramm. Um das Ergebnis zu erhalten, müssen zwei Zahlen und Operationssymbole eingegeben werden.

Fragenanalyse:

Das Programm sollte: (1) wartbar; (3) erweiterbar;
Wartbar: Dies bedeutet, dass eine Änderung des Codes an einer Stelle keine Kettenreaktion auslösen und keine Auswirkungen auf andere Stellen haben kann.
Wiederverwendbar: Sich wiederholender Code minimieren.
Erweiterbar: Wenn Sie neue Funktionen und neue Geschäfte erweitern möchten, müssen Sie nur neue Klassen hinzufügen, ohne dass sich dies auf vorhandene Klassen und Logik auswirkt. Plug-in-Anwendungen.
Objektorientierte Schlüsselpunkte:
Die drei Hauptmerkmale der Objektorientierung: Kapselung, Vererbung und Polymorphismus.
Reduzieren Sie die Programmkopplung durch Kapselung, Vererbung und Polymorphismus.
Geschäftslogik und Schnittstellenlogik sind getrennt.

Klassenstrukturdiagramm:


Code-Implementierung:

1. Finden Sie die Bereiche des Unternehmens heraus, die anfällig für Veränderungen sind. In dieser Anwendung ist es erforderlich, das Operationsergebnis aus zwei Zahlen zu berechnen. Daher ist es ein Teil, der sich leicht ändern kann, welche Art von Operation ausgeführt werden muss. Beispielsweise möchten wir jetzt nur Additions-, Subtraktions-, Multiplikations- und Divisionsoperationen implementieren und später Wurzel-Wurzel- oder Restoperationen hinzufügen. Wie geht man also mit den Veränderungen um, die diese Nachfrage mit sich bringt? Beim Entwerfen eines Programms sollten Sie die Wartbarkeit, Skalierbarkeit, Wiederverwendbarkeit des Codes, Flexibilität usw. des Programms berücksichtigen.

2. Diese Recheneinheit verfügt beispielsweise nur über vier Operationen: Addition, Subtraktion, Multiplikation und Division. Erstellen Sie zunächst eine Operationsklasse. Diese Klasse ist die übergeordnete Klasse verschiedener spezifischer Operationsklassen (Addition, Subtraktion, Multiplikation und Division). Sie akzeptiert hauptsächlich von Benutzern eingegebene Werte. Die Klasse ist wie folgt:


class Operation(): 
  def __init__(self,NumberA=0,NumberB=0): 
    self.NumberA = NumberA 
    self.NumberB = NumberB 
 
  def GetResult(self): 
    pass

3 Dann gibt es die spezifischen Operationsklassen: Add, Sub, Mul, p. Sie alle erben die Operation-Klasse und überschreiben die Methode getResult(). Auf diese Weise kann Polymorphismus verwendet werden, um die Kopplung verschiedener Geschäftslogiken zu reduzieren, und Änderungen an einer Operationsklasse haben keine Auswirkungen auf andere Operationsklassen. Der Code der jeweiligen Klasse lautet wie folgt:


class AddOp(Operation): 
  def GetResult(self): 
    return self.NumberB + self.NumberA 
 
class MinusOp(Operation): 
  def GetResult(self): 
    return self.NumberA - self.NumberB 
 
class MultiOp(Operation): 
  def GetResult(self): 
    return self.NumberA * self.NumberB 
 
class pideOp(Operation): 
  def GetResult(self): 
    try: 
      return 1.0*self.NumberA / self.NumberB 
    except ZeropisionError: 
      raise

4 Wie kann ich dem Rechner also mitteilen, welche Operation ich verwenden möchte? Mit anderen Worten, welche spezifische Operationsklasse sollte instanziiert werden? Sub? Mul? P? Zu diesem Zeitpunkt sollten Sie die Verwendung einer separaten Klasse für die Erstellung bestimmter Instanzen in Betracht ziehen. Diese Klasse ist die Factory-Klasse. Wie folgt:


class OperationFatory(): 
  def ChooseOperation(self,op): 
    if op == '+': 
      return AddOp() 
    if op == '-': 
      return MinusOp() 
    if op == '*': 
      return MultiOp() 
    if op == '/': 
      return pideOp()

5. Auf diese Weise muss der Benutzer nur den Operator eingeben, und die Factory-Klasse kann die entsprechende Instanz erstellen Polymorphismus, also Rückkehr zu Das Operationsergebnis wird auf die Art und Weise der übergeordneten Klasse realisiert. Der Client-Code lautet wie folgt:


if __name__ == '__main__': 
  ch = '' 
  while not ch=='q':  
    NumberA = eval(raw_input('Please input number1: ')) 
    op = str(raw_input('Please input the operation: ')) 
    NumberB = eval(raw_input('Please input number2: ')) 
    OPFactory = OperationFatory() 
    OPType = OPFactory.ChooseOperation(op) 
    OPType.NumberA = NumberA 
    OPType.NumberB = NumberB 
    print 'The result is:',OPType.GetResult() 
    print '\n#-- input q to exit any key to continue' 
    try: 
      ch = str(raw_input()) 
    except: 
      ch = ''

Der Vollversionscode lautet wie folgt:


# -*-coding:UTF-8-*-  
from abc import ABCMeta,abstractmethod 
 
class Operation(): 
  def __init__(self,NumberA=0,NumberB=0): 
    self.NumberA = NumberA 
    self.NumberB = NumberB 
 
  def GetResult(self): 
    pass 
 
class AddOp(Operation): 
  def GetResult(self): 
    return self.NumberB + self.NumberA 
 
class MinusOp(Operation): 
  def GetResult(self): 
    return self.NumberA - self.NumberB 
 
class MultiOp(Operation): 
  def GetResult(self): 
    return self.NumberA * self.NumberB 
 
class pideOp(Operation): 
  def GetResult(self): 
    try: 
      return 1.0*self.NumberA / self.NumberB 
    except ZeropisionError: 
      raise 
 
class OperationFatory(): 
  def ChooseOperation(self,op): 
    if op == '+': 
      return AddOp() 
    if op == '-': 
      return MinusOp() 
    if op == '*': 
      return MultiOp() 
    if op == '/': 
      return pideOp() 
 
if __name__ == '__main__': 
  ch = '' 
  while not ch=='q':  
    NumberA = eval(raw_input('Please input number1: ')) 
    op = str(raw_input('Please input the operation: ')) 
    NumberB = eval(raw_input('Please input number2: ')) 
    OPFactory = OperationFatory() 
    OPType = OPFactory.ChooseOperation(op) 
    OPType.NumberA = NumberA 
    OPType.NumberB = NumberB 
    print 'The result is:',OPType.GetResult() 
    print '\n#-- input q to exit any key to continue' 
    try: 
      ch = str(raw_input()) 
    except: 
      ch = ''

Das obige ist der detaillierte Inhalt vonEinführung in die Python-Version des einfachen Factory-Musters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn