聊聊Swift中的設計模式---建立型(工廠模式)
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() ```
三者的對比
結語
在日常開發中,簡單工廠模式應該是用的最多的,但是缺點也是十分明顯。其他兩種模式,也有不同程度的優缺點,大家需要根據實際情況進行選擇。 ,
擴充套件閱讀 下面還有其他模式
- 道阻且長,如何?行路難
- 聊聊Swift中的設計模式---建立型(工廠模式)
- 聊聊Swift中的設計模式---行為型(策略模式)
- 聊聊Swift中的設計模式---行為型(觀察者模式)
- 聊聊Swift中的設計模式---行為型(中介者模式)(26)
- 聊聊Swift中的設計模式---行為型(命令模式)(25)
- 聊聊Swift中的設計模式---結構型(享元模式)
- 聊聊Swift中的設計模式---結構型(外觀模式)
- iOS控制元件介紹---UIStackView 一個類似於flexbox的佈局控制元件
- 作為iOSer,如何讓自己的專案更有溫度?(中)
- 作為iOSer,如何讓自己的專案更有溫度?(上)
- 使用RXSwift擼一個MVVM架構的Tableview
- 使用RXSwift擼一個倒計時按鈕
- 如何將 opencv_contrib 中的第三方庫 打包到 opencv 中,並生成iOS用的framework
- 字元陣列和字串基本掌握
- 【第2章】matlab程式設計基礎
- 手寫Vue2.0原始碼-渲染更新原理
- nginx
- 手動實現vue2.0的雙向資料繫結原理
- STM32延時函式的四種方法