Design Patterns in Swift: Part I – Creational Design Pattern

Design Patterns sind verschiedene Lösungen für Softwareentwicklungsprobleme. Software kann auch ohne sie entwickelt werden, aber es ist viel schwieriger.
Ich werde eine dreiteilige Serie über Entwurfsmuster veröffentlichen. In diesem Beitrag werde ich über kreative Entwurfsmuster sprechen.

Kreative Entwurfsmuster sind Entwurfsmuster, die sich mit Mechanismen der Objekterzeugung befassen und versuchen, Objekte auf eine der Situation angemessene Weise zu erzeugen. Die Grundform der Objekterzeugung kann zu Entwurfsproblemen oder zu einer zusätzlichen Komplexität des Entwurfs führen. Kreative Entwurfsmuster lösen dieses Problem, indem sie die Objekterzeugung irgendwie kontrollieren.
Quelle: wikipedia.org

Hier werden wir die fünf kreativen Entwurfsmuster besprechen und wie wir sie in swift verwenden können.

Diese Art von Entwurfsmuster wird verwendet, um ein neues Objekt zu instanziieren, indem man ein bestehendes Objekt, den Prototyp, klont.

Sie würden eine abstrakte Klon-Funktion des Fruit-Protokolls sehen, die von der Apple-Klasse implementiert wird, die tatsächlich das aktuelle Objekt selbst zurückgibt.

Lassen Sie uns den obigen Code im Playground ausführen.

// Create a prototype
let prototype = Apple(count: 4)// Create a copy of existing object
let redApple: Apple = prototype.clone() as! Apple
redApple.count // 4// add own properties
redApple.set(price: "")
redApple.price // // Create a copy of existing object
let greenApple: Apple = prototype.clone() as! Apple
greenApple.count // 4// add own properties
greenApple.set(price: "")
greenApple.price //

– Wenn Sie ein Objekt klonen, werden alle Eigenschaften dieses Objekts in
ein anderes Objekt kopiert.
– Dieses Entwurfsmuster sollte verwendet werden, wenn Sie ein Objekt erstellen müssen, ohne die Hierarchie dieser Klasse zu kennen

Das Factory Method Pattern

Es ist das am häufigsten verwendete Entwurfsmuster. Im Grunde abstrahiert es nur die Erstellung eines Objekts.

Erstelle eine Klasse namens FruitFactory, die den Typ des benötigten Objekts zurückgibt.
Füge eine statische Methode hinzu, die ein Enum namens FruitType als Parameter akzeptiert und das benötigte Objekt zur Laufzeit zurückgibt.

Jede Instanz, die von der Factory zurückgegeben wird, wäre vom Typ Interface (im Swift-Protokoll), das jede Factory-Kandidatenklasse implementiert haben muss.

Nach dem Ausführen des obigen Codes in der Spielwiese:

// get the object of class Orange from the FruitFactory class
let orange = FruitFactory.getFruit(forType: .orange)
orange?.getPrice() // "
orange?.getCount() // 2// get the object of class Grapes from the FruitFactory class
let grapes = FruitFactory.getFruit(forType: .grapes)
grapes?.getPrice() // ""
grapes?.getCount() // 1

– Der Typ des erzeugten Objekts wird zur Laufzeit bestimmt.
– Dieses Entwurfsmuster macht die Codebasis flexibler, um neue Typen hinzuzufügen oder zu entfernen.

Dies führt uns in das Konzept des Programms zu einer Schnittstelle ein, nicht zu einer Implementierung.

Dieses Entwurfsmuster bietet eine Schnittstelle zum Erstellen von Familien verwandter Objekte, ohne ihre konkreten Klassen anzugeben. Sie werden oft mit dem Factory-Methode-Muster implementiert.

Wir haben eine abstrakte Fabrik namens Furniture Factory zur Erstellung verschiedener Produkte. Die konkrete Fabrikklasse Factory wird das Protokoll von Furniture Factory implementieren.

Wir führen den obigen Code aus.

// create MyChair class object
let chair = Factory.createChair()
chair.count() // 4// create MyTable class object
let table = Factory.createTable()
table.count() // 1

– Offenbart die Schnittstelle, nicht ihre Implementierung
– Abstrakte Fabrik ist wie ein Protokoll, das wir auf eine konkrete Klasse anwenden werden, um Objekte zu erstellen

Builder Pattern

Dieses Entwurfsmuster trennt den Prozess der Erstellung von Objekten von ihrer tatsächlichen Verwendung.

Zuerst deklarieren wir ein abstraktes Protokoll (oder eine Schnittstelle) zur Erstellung des Produkts. In diesem Fall ist es das ShoeShop-Protokoll.
Die Klasse Nike ist ein konkreter Builder, der den Prozess der Produkterstellung kapselt.

Director erstellt ein Objekt mit Hilfe des Builder-Protokolls. Director sollte mit einem Objekt initialisiert werden, das dem ShoeShop-Protokoll entspricht.

Nach dem Ausführen des Codes.

// create a nike object
let nike = Nike()// instantiate Director with nike object
let director = Director(shoeShop: nike)// encapsulated the process of producing the nike product
director.produce() // "Shoe produced"

– Verwenden Sie das Builder-Muster, wenn Sie öffentliche APIs erstellen, da es die Implementierungsdetails nicht preisgibt
– Verbirgt die Komplexität. Es bietet eine einfache API hinter einer komplexen Aufgabe.

Singleton Design Pattern

In swift definieren wir Singleton-Klassen mit dem Schlüsselwort static. Es bedeutet, dass das Objekt nur einmal instanziiert wird. Statische Eigenschaften werden träge initialisiert und erst beim Aufruf instanziiert.
Es gibt nur eine Kopie dieses Objekts, die von den anderen Objekten global verwendet wird.

Wir können die Verwendung auch in Apple-Frameworks sehen:

// Shared url session
let urlSession = URLSession.shared// user defaults
let userDefaults = UserDefaults.standard

Nach dem Ausführen des Codes

Vehicle.sharedInstance.getName() // "Car"

– Wir verwenden das let-Schlüsselwort, um sicherzustellen, dass sich der Wert von shredInstance nicht ändert
– Vergessen Sie nicht, den privaten Initialisierer hinzuzufügen, um zu verhindern, dass andere Klassen seine Standardinitialisierer aufrufen

Hier ist der Link zu den Playground-Dateien.

Der Hauptgrund, warum wir das Creational Design Pattern verwenden, ist die Entkopplung der Logik der Erstellung eines Objekts von seiner Verwendung. Es hilft, die Komplexität zu reduzieren, indem Objekte auf kontrollierte Weise mit bereits erwähnten, erprobten & Lösungen erstellt werden.

Wenn Sie mehr über Behavioral Design Patterns lesen möchten, finden Sie hier den Link zum Blog.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.