Design Patterns în Swift: Part I – Creational Design Pattern

Programele de proiectare sunt soluții diferite la probleme de inginerie software. Softurile pot fi construite și fără ele, dar este mult mai greu.
Voi lansa o serie de trei părți referitoare la design pattern. În această postare, voi discuta despre modelele de proiectare de creație.

Patronii de proiectare de creație sunt modele de proiectare care se ocupă de mecanismele de creare a obiectelor, încercând să creeze obiecte într-o manieră potrivită cu situația. Forma de bază de creare a obiectelor ar putea duce la probleme de proiectare sau la un plus de complexitate pentru proiectare. Modelele de proiectare creativă rezolvă această problemă controlând cumva această creare de obiecte.
Sursa: wikipedia.org

În cele ce urmează vom discuta cele cinci modele de proiectare creativă și modul în care le putem utiliza în swift.

Acest tip de model de proiectare este utilizat pentru a instanția un nou obiect prin clonarea unui obiect existent numit prototip.

Vă veți vedea o funcție abstractă de clonare a protocolului Fruit implementată de clasa Apple care returnează de fapt însuși obiectul curent.

Să rulăm codul de mai sus în playground.

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

– Atunci când clonezi un obiect, toate proprietățile acelui obiect sunt copiate în
un alt obiect.
– Acest model de proiectare trebuie utilizat atunci când trebuie să creați un obiect fără a cunoaște ierarhia acelei clase

Patronul metodei Factory

Este cel mai frecvent utilizat model de proiectare. Practic, acesta doar abstractizează crearea unui obiect.

Creați o clasă numită FruitFactory care returnează tipul obiectului necesar.
Adaugați o metodă statică care acceptă ca parametru un enum numit FruitType și returnează obiectul necesar la momentul execuției.

Care instanță returnată de fabrică ar fi de tip Interface(în protocolul swift) pe care orice clasă candidată la fabrică trebuie să o fi implementat.

După rularea codului de mai sus în playground:

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

– Tipul obiectului creat este determinat la momentul execuției.
– Acest model de proiectare face ca baza de cod să fie mai flexibilă pentru a adăuga sau elimina noi tipuri.

Aceasta ne introduce în conceptul de program la o interfață, nu la o implementare.

Acest model de proiectare oferă o interfață pentru a crea familii de obiecte înrudite fără a specifica clasele lor concrete. Ele sunt adesea implementate cu modelul Factory Method.

Avem o fabrică abstractă numită Fabrica de mobilă pentru a crea diferite produse. Clasa fabrică concretă Factory va implementa protocolul Furniture Factory.

Executarea codului de mai sus.

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

– Dezvăluie interfața, nu și implementarea ei
– Fabrica abstractă este ca un protocol pe care îl vom folosi pe o clasă concretă pentru a crea obiecte

Patronul Constructor

Acest model de proiectare separă procesul de creare a obiectelor de utilizarea efectivă a acestora.

Primul lucru este să declarăm un protocol abstract (sau interfață) pentru crearea produsului. În acest caz este protocolul ShoeShop.
Clasa Nike este un constructor concret pentru a încapsula procesul de creare a produsului.

Directorul creează obiectul folosind protocolul constructorului. Directorul ar trebui inițializat cu obiectul care se conformează protocolului ShoeShop.

După rularea codului.

// 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"

– Utilizați modelul Builder atunci când construiți API-uri publice deoarece nu dezvăluie detaliile de implementare
– Ascunde complexitatea. Oferă o API simplă în spatele unei sarcini complexe.

Singleton Design Pattern

În swift definim clasele Singleton folosind cuvântul cheie static. Aceasta înseamnă că obiectul va fi instanțiat o singură dată. Proprietățile statice sunt inițializate leneș și nu vor fi instanțiate până nu sunt apelate.
Există o singură copie a acestui obiect și este utilizată de celelalte obiecte la nivel global.

Potem vedea utilizarea și în cadrele Apple:

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

După rularea codului

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

– Utilizăm cuvântul cheie let pentru a ne asigura că valoarea shredInstance nu se va schimba
– Nu uitați să adăugați inițializatorul privat pentru a împiedica alte clase să apeleze inițializatoarele sale implicite

Iată linkul către fișierele playground.

Motivul principal pentru care folosim Creational Design Pattern este de a decupla logica de creare a unui obiect de utilizarea acestuia. Ajută la reducerea complexității prin crearea obiectelor într-o manieră controlată, cu soluții deja menționate și încercate & testate.

Pentru a citi despre modelele de proiectare comportamentală, iată linkul către blog.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.