聊聊Swift中的設計模式---建立型(工廠模式)

語言: CN / TW / HK

theme: cyanosis

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第14天,點選檢視活動詳情


前言

在面向物件的開發過程中,其實咱們或多或少的都接觸過一些設計模式,可能知道或不知道其對應的名稱,也不知道其具體使用場景,今天咱們就來說說幾種常見的設計模式,幫助你們在開發過程中,更加得心應手。

正文

工廠模式

工廠模式根據抽象程度的不同分為三種:簡單工廠模式(也叫靜態工廠模式)、工廠方法模式、抽象工廠模式。

簡單工廠模式

根據傳入的引數的不同,返回不同的類的例項。

簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

例子:Button的樣式,可根據傳入不同的列舉,輸出相應樣式的按鈕。

``` enum Style {case mac, win}

protocol Button {} class MacButton: Button {} class WinButton: Button {}

class ButtonFactory { func createButton(style: Style) -> Button { switch style { case .mac: return MacButton() default: return WinButton() } } }

var style: Style = .mac var fac = ButtonFactory() fac.createButton(style: style)

```

工廠方法模式

工廠方法模式是簡單工廠的進一步深化

在這個模式中,會對不同的物件提供不同的工廠方法。也就是說每個物件都有一個與之對應的工廠。

定義一個建立物件的介面,但讓實現這個介面的類來決定例項化哪個類。工廠方法讓類的例項化推遲到子類中進行

例子1:Reader 的樣式。

有一個Reader類表示圖片讀取,另有它的三個子類 JPGReader, PNGReader和 GIFReader 分別代表 jpg、png 和 gif 讀取。

``` protocol Reader { func read() }

class JPGReader : Reader { func read() { print("read jpg") } }

class PNGReader: Reader { func read() { print("read png") } }

class GIFReader: Reader { func read() { print("read gif") } }

protocol ReaderFactory { func getReader() -> Reader }

class JPGReaderFactory : ReaderFactory { func getReader() -> Reader { JPGReader() } }

class PNGReaderFactory: ReaderFactory { func getReader() -> Reader { PNGReader() } }

class GIFReaderFactory: ReaderFactory { func getReader() -> Reader { GIFReader() } }

// 讀取GIF var factory: ReaderFactory = GIFReaderFactory() var reader: Reader = factory.getReader() reader.read()

// 讀取png factory = PNGReaderFactory() reader = factory.getReader() reader.read()

// 讀取 JPG factory = JPGReaderFactory() reader = factory.getReader() reader.read() ```

抽象工廠模式

為建立一組相關或相互依賴的物件提供一個介面,而且無需指定他們的具體類。

例子: 汽車樣例

假設我們有兩種產品介面 BenzCar、AudiCar 和 BmwCar ,每一種產品都支援多種系列,比如 Sport 系列和 Business 系列。這樣每個系列的產品分別是 BenzSportCar, BenzBusinessCar, BmwSportCar, BmwBusinessCar,AudiSportCar,AudiBusinessCar 。為了可以在執行時刻建立一個系列的產品族,我們可以為每個系列的產品族建立一個工廠 SupportDriver 和 BusinessDriver 。每個工廠都有三個方法 createBenzCar ,createBmwCar 和 createAudiCar 並返回對應的產品,可以將這三個方法抽象成一個介面 Driver 。這樣在執行時刻我們可以選擇建立需要的產品系列。

``` class BenzCar { var name: String init(name: String) { self.name = name }

func drive() {}

}

class BenzSportCar : BenzCar { override func drive() { print("(name) :: BenzSportCart") } }

class BenzBusinessCar : BenzCar { override func drive() { print("(name) :: BenzBusinessCar") } }

class BmwCar { var name: String

init(name: String) {
    self.name = name
}

func drive() {}

}

class BmwSportCar : BmwCar { override func drive() { print("(name) :: BmwCSportCart") } }

class BmwBusinessCar : BmwCar { override func drive() { print("(name) :: BmwBusinessCar") } }

class AudiCar { var name: String

init(name: String) {
    self.name = name
}

func drive() {}

}

class AudiSportCar : AudiCar { override func drive() { print("(name) :: AudiCSportCart") } }

class AudiBusinessCar : AudiCar { override func drive() { print("(name) :: AudiBusinessCar") } }

protocol Driver { func createBenzCar(car: String) -> BenzCar func createBmwCar(car: String) -> BmwCar func createAudiCar(car: String) -> AudiCar }

class SupportDriver : Driver {

func createBenzCar(car: String) -> BenzCar {
    BenzSportCar.init(name: car)
}

func createBmwCar(car: String) -> BmwCar {
    BmwSportCar.init(name: car)
}

func createAudiCar(car: String) -> AudiCar {
    AudiSportCar.init(name: car)
}

}

class BusinessDriver: Driver { func createBenzCar(car: String) -> BenzCar { BenzBusinessCar.init(name: car) }

func createBmwCar(car: String) -> BmwCar {
    BmwBusinessCar.init(name: car)
}

func createAudiCar(car: String) -> AudiCar {
    AudiBusinessCar.init(name: car)
}

}

let driver = BusinessDriver() let car = driver.createAudiCar(car: "BusinessDriver") car.drive() ```

三者的對比

截圖2022-06-07 上午10.46.26.png

結語

在日常開發中,簡單工廠模式應該是用的最多的,但是缺點也是十分明顯。其他兩種模式,也有不同程度的優缺點,大家需要根據實際情況進行選擇。 ,


擴充套件閱讀 下面還有其他模式

建立型-建造者模式

結構型-介面卡模式

結構型-橋接模式

結構型-組合模式