1.工廠方法模式簡(jiǎn)介
工廠方法模式(Factory Pattern),是創(chuàng)建型設(shè)計(jì)模式之一(設(shè)計(jì)模式分類(lèi):http://www.reibang.com/p/18fee11deac9)。工廠方法也稱(chēng)為虛構(gòu)造器(virtual constructor),它適用于這種情況:一個(gè)類(lèi)無(wú)法預(yù)期需要生成哪個(gè)類(lèi)的對(duì)象随夸,想讓子類(lèi)來(lái)指定所生成的對(duì)象。工廠方法使得一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)蒸殿。
與直接創(chuàng)建新的具體對(duì)象相比,使用工廠方法創(chuàng)建對(duì)象可算作一種最佳方法鸣峭。工廠方法模式讓客戶(hù)程序可以要求由工廠方法創(chuàng)建的對(duì)象擁有一組共同的行為宏所。所以往類(lèi)層次結(jié)構(gòu)中引入新的具體產(chǎn)品并不需要修改客戶(hù)端代碼,因?yàn)榉祷氐娜魏尉唧w對(duì)象的接口都跟客戶(hù)端一直在用的從前的接口相同摊溶。
2.工廠方法模式定義
定義一個(gè)用于創(chuàng)建對(duì)象的接口爬骤,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。
3.工廠方法模式的使用場(chǎng)景
在任何需要生成復(fù)雜對(duì)象的地方莫换,都可以使用工廠方法模式霞玄。復(fù)雜對(duì)象適合使用工廠模式,用new就可以完成創(chuàng)建的對(duì)象無(wú)需使用工廠模式拉岁。
3.1 編譯時(shí)無(wú)法準(zhǔn)確預(yù)期要?jiǎng)?chuàng)建的對(duì)象的類(lèi)
3.2 類(lèi)想讓其子類(lèi)決定在運(yùn)行時(shí)創(chuàng)建什么
3.3 類(lèi)有若干輔助類(lèi)為其子類(lèi)坷剧,而你想將返回哪個(gè)子類(lèi)這一信息局部化(出自《Objective-C編程之道 iOS設(shè)計(jì)模式解析》)
工廠方法模式把具體產(chǎn)品的創(chuàng)建推遲到工廠類(lèi)的子類(lèi)(具體工廠)中,此時(shí)工廠類(lèi)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建喊暖,而只是給出具體工廠必須實(shí)現(xiàn)的接口惫企,這樣工廠方法模式在添加新產(chǎn)品的時(shí)候就不修改工廠類(lèi)邏輯而是添加新的工廠子類(lèi),符合開(kāi)放封閉原則陵叽。
常見(jiàn)例子是Cocoa Touch框架中的NSNumber,例如狞尔,[NSNumber numberWithBool:YES] 消息會(huì)得到Number的子類(lèi)NSCFBoolean的一個(gè)實(shí)例丛版。
4.工廠方法模式的UML圖
5.角色劃分
角色一:抽象產(chǎn)品 (一個(gè))
角色二:具體產(chǎn)品 (多個(gè))
角色三:抽象工廠 (一個(gè))
角色四:具體工廠 (多個(gè))
6.Demo 實(shí)踐
Demo以三星和華為生產(chǎn)電腦舉例,還是先看圖偏序,UML圖如下:
Demo地址:https://github.com/zhiyoukaifa/FactoryPattern
參考書(shū)籍:
《Objective-C編程之道 iOS設(shè)計(jì)模式解析》
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》
參考博客:
https://blog.andyqiao.top/article/12/
https://blog.csdn.net/carson_ho/article/details/52343584