Wzorce projektowe w Swift: Part I – Creational Design Pattern

Wzorce projektowe to różne rozwiązania problemów związanych z inżynierią oprogramowania. Oprogramowanie może być zbudowane bez nich, ale jest to o wiele trudniejsze.
Będę publikował trzyczęściową serię dotyczącą wzorców projektowych. W tym poście będę omawiał kreacyjne wzorce projektowe.

Kreacyjne wzorce projektowe to wzorce projektowe, które zajmują się mechanizmami tworzenia obiektów, próbując tworzyć obiekty w sposób odpowiedni do sytuacji. Podstawowa forma tworzenia obiektów może powodować problemy projektowe lub dodatkową złożoność projektu. Kreacyjne wzorce projektowe rozwiązują ten problem, w jakiś sposób kontrolując to tworzenie obiektów.
Źródło: wikipedia.org

W tym miejscu omówimy pięć kreacyjnych wzorców projektowych i to, jak możemy ich używać w swifcie.

Ten typ wzorca projektowego jest używany do instancjonowania nowego obiektu przez klonowanie istniejącego obiektu zwanego prototypem.

Zobaczyłbyś abstrakcyjną funkcję klonowania protokołu Fruit zaimplementowaną przez klasę Apple, która w rzeczywistości zwraca sam bieżący obiekt.

Uruchommy powyższy kod na placu zabaw.

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

– Kiedy klonujesz obiekt, wszystkie właściwości tego obiektu są kopiowane do
innego obiektu.
– Ten wzorzec projektowy powinien być używany, gdy trzeba stworzyć obiekt bez znajomości hierarchii tej klasy

The Factory Method Pattern

Jest to najczęściej używany wzorzec projektowy. W zasadzie abstrahuje on po prostu od tworzenia obiektu.

Stwórz klasę o nazwie FruitFactory, która zwraca typ potrzebnego obiektu.
Dodaj statyczną metodę, która przyjmuje enum o nazwie FruitType jako parametr i zwraca obiekt potrzebny w czasie wykonywania.

Każda instancja zwrócona przez fabrykę byłaby typu Interface(w protokole swift), który każda klasa kandydująca do fabryki musi mieć zaimplementowany.

Po uruchomieniu powyższego kodu na placu zabaw:

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

– Typ tworzonego obiektu jest określany w czasie wykonywania.
– Ten wzorzec projektowy czyni bazę kodową bardziej elastyczną w celu dodawania lub usuwania nowych typów.

To wprowadza nas w pojęcie programu do interfejsu, a nie implementacji.

Ten wzorzec projektowy zapewnia interfejs do tworzenia rodzin powiązanych obiektów bez określania ich konkretnych klas. Często są one implementowane za pomocą wzorca Factory Method.

Mamy abstrakcyjną fabrykę o nazwie Fabryka Mebli do tworzenia różnych produktów. Konkretna klasa Factory będzie implementować protokół Fabryki Mebli.

Uruchamiając powyższy kod.

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

– Ujawnia interfejs, a nie jego implementację
– Abstrakcyjna fabryka jest jak protokół, którego będziemy używać na konkretnej klasie do tworzenia obiektów

Wzorzec konstruktora

Ten wzorzec projektowy oddziela proces tworzenia obiektów od ich rzeczywistego użycia.

Najpierw deklarujemy abstrakcyjny protokół(lub interfejs) do tworzenia produktu. W tym przypadku jest to protokół ShoeShop.
Klasa Nike jest konkretnym konstruktorem do enkapsulacji procesu tworzenia produktu.

Director tworzy obiekt używając protokołu konstruktora. Director powinien być zainicjalizowany obiektem zgodnym z protokołem ShoeShop.

Po uruchomieniu kodu.

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

– Używaj wzorca Builder podczas budowania publicznych API, ponieważ nie ujawnia on szczegółów implementacji
– Ukrywa złożoność. Zapewnia proste API za złożonym zadaniem.

Singleton Design Pattern

W swifcie definiujemy klasy Singleton, używając statycznego słowa kluczowego. Oznacza to, że obiekt będzie instancjonowany tylko raz. Właściwości statyczne są inicjowane leniwie i nie będą instancjonowane aż do wywołania.
Istnieje tylko jedna kopia tego obiektu i jest używana przez inne obiekty globalnie.

Możemy również zobaczyć zastosowanie we frameworkach Apple:

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

Po uruchomieniu kodu

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

– Używamy słowa kluczowego let, aby upewnić się, że wartość shredInstance nie ulegnie zmianie
– Nie zapomnij dodać prywatnego inicjalizatora, aby uniemożliwić innym klasom wywoływanie jego domyślnych inicjalizatorów

Tutaj znajduje się link do plików placu zabaw.

Głównym powodem, dla którego używamy Creational Design Pattern jest odłączenie logiki tworzenia obiektu od jego użycia. Pomaga on zmniejszyć złożoność poprzez tworzenie obiektów w kontrolowany sposób z już wspomnianymi, wypróbowanymi & rozwiązaniami.

Do przeczytania o behawioralnych wzorcach projektowych, tutaj jest link do bloga.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.