工廠模式
工廠模式可簡單的分為三類:簡單工廠,工廠方法,抽象工廠
簡單工廠模式
定義
簡單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式潜必,但不屬于23種GOF設(shè)計(jì)模式之一。簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例沃但。簡單工廠模式是工廠模式家族中最簡單實(shí)用的模式磁滚,可以理解為是不同工廠模式的一個特殊實(shí)現(xiàn)
角色
工廠類角色:這是本模式的核心,含有一定的商業(yè)邏輯和判斷邏輯,根據(jù)邏輯不同垂攘,產(chǎn)生具體的工廠產(chǎn)品
抽象產(chǎn)品角色:它一般是具體產(chǎn)品繼承的父類或者實(shí)現(xiàn)的接口维雇。由接口或者抽象類來實(shí)現(xiàn)
具體產(chǎn)品角色:工廠類所創(chuàng)建的對象就是此角色的實(shí)例。在oc中由一個具體類實(shí)現(xiàn)
應(yīng)用場景
編譯時無法確定預(yù)期要創(chuàng)建的對象類
類想讓子類決定運(yùn)行時創(chuàng)建什么
類有若干的輔助子類晒他,而你想將返回那個子類這一信息局部化
簡化理解
簡單工廠模式:專門定義一個類來創(chuàng)建其他類的實(shí)例吱型,被創(chuàng)建的實(shí)例常常具有共同的父類,實(shí)際上就是由一個工廠類陨仅,根據(jù)傳入的參數(shù)津滞,動態(tài)的決定創(chuàng)建哪個產(chǎn)品的實(shí)例
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):客戶端調(diào)用簡單明了,不需要關(guān)注太多的邏輯
缺點(diǎn):也正是所謂的優(yōu)點(diǎn)灼伤,導(dǎo)致了工廠類中揉雜了太多的業(yè)務(wù)邏輯触徐,工廠類卻違反了開閉原則,因?yàn)槊吭黾右粋€產(chǎn)品狐赡,工廠類都需要進(jìn)行邏輯修改和判斷撞鹉,導(dǎo)致耦合度太高
工廠方法
定義
定義創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個類颖侄。工廠方法使得一個類的實(shí)例化延遲到其子類鸟雏。
上面提過了簡單工廠模式中的工廠類揉雜了太多了業(yè)務(wù)邏輯,耦合度太高了发皿,比如又新增了一種具體產(chǎn)品角色崔慧,那么我們還需要在工廠類里增加判斷,然后在根據(jù)判斷去創(chuàng)建新增加的具體產(chǎn)品角色
角色
- 抽象工廠:(iOS是接口(協(xié)議)穴墅,java是抽象類)惶室,工廠標(biāo)準(zhǔn)
- 具體工廠:遵守工廠標(biāo)準(zhǔn)
- 抽象產(chǎn)品:(接口(協(xié)議),抽象類)
- 具體產(chǎn)品
簡單理解
抽象產(chǎn)品角色(可以是接口(協(xié)議中的接口)或者抽象類)定義里工廠方法創(chuàng)建的對象的接口和產(chǎn)品的共性玄货,
在工廠方法中皇钞,核心的工廠類角色不再去負(fù)責(zé)創(chuàng)建具體產(chǎn)品,而是由它的子類去做松捉,這個工廠類角色夹界,僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不接觸哪一個產(chǎn)品類被實(shí)例化這種細(xì)節(jié)
與直接創(chuàng)建新的具體產(chǎn)品相比隘世,工廠方法模式讓客戶程序可以要求由工廠方法創(chuàng)建的對象擁有一組共同的行為可柿。這樣往類層次結(jié)構(gòu)中引入新的具體產(chǎn)品時,并不需要修改客戶端代碼丙者,因?yàn)榉祷氐娜魏尉唧w對象的接口都跟客戶端一直在用的從前的接口相同复斥。從結(jié)構(gòu)圖也可以看到,工廠方法模式中的工廠類與產(chǎn)品類往往具有平行的等級結(jié)構(gòu)械媒,它們之間一一對應(yīng)目锭。
與簡單工廠模式的對比
在簡單工廠模式中评汰,由工廠類根據(jù)參數(shù)負(fù)責(zé)創(chuàng)建具體的產(chǎn)品;而在工廠方法模式中痢虹,工廠類只定義了一個創(chuàng)建產(chǎn)品的抽象接口被去,創(chuàng)建具體產(chǎn)品的工作由具體的工廠來實(shí)現(xiàn)。如果需要增加其他類型的圖形繪制奖唯,那么使用簡單工廠模式實(shí)現(xiàn)的話惨缆,首先需要增加一個其他圖形繪制的類,然后修改工廠類臭埋,在里面加分支語句來判斷踪央;使用工廠方法模式實(shí)現(xiàn)的話,不僅需要增加圖形繪制類瓢阴,還需要增加具體工廠類畅蹂。看到這里荣恐,可能大家會感覺到液斜,工廠方法模式不但沒有減少難度,反而增加了一些類和復(fù)雜度叠穆。這樣來看少漆,是不是沒有必要使用工廠方法模式?咱們再回顧一下開篇介紹的六大設(shè)計(jì)原則硼被,有一個原則是開放-關(guān)閉原則示损,簡單工廠模式不僅對擴(kuò)展開放,而且對修改也開放嚷硫,開放-關(guān)閉原則检访。工廠方法模式是簡單工廠模式的進(jìn)一步抽象,它保持了簡單工廠模式的優(yōu)點(diǎn)(去除了客戶端與具體產(chǎn)品的依賴)仔掸,而且克服了它的缺點(diǎn)開放-關(guān)閉原則脆贵。它的缺點(diǎn)是每增加一個產(chǎn)品,就需要加一個產(chǎn)品工廠的類起暮,增加了額外的開發(fā)工作量
抽象工廠模式
定義
在前面兩章中卖氨,分別介紹了簡單工廠模式和工廠方法模式,我們知道簡單工廠模式的優(yōu)點(diǎn)是去除了客戶端與具體產(chǎn)品的依賴负懦,缺點(diǎn)是違反了開放-關(guān)閉原則筒捺;工廠方法模式克服了簡單工廠模式的缺點(diǎn),將產(chǎn)品的創(chuàng)建工作放到具體的工廠類纸厉,每個工廠類負(fù)責(zé)生成一個產(chǎn)品焙矛。但是在實(shí)際應(yīng)用中,一個工廠類只創(chuàng)建單個產(chǎn)品的情況很少残腌,一般一個工廠類會負(fù)責(zé)創(chuàng)建一系列相關(guān)的產(chǎn)品,如果我們要設(shè)計(jì)這樣的系統(tǒng),工廠方法模式顯然不能滿足應(yīng)用的需求抛猫,本章要介紹的抽象工廠模式蟆盹,可以很好地解決一系列產(chǎn)品創(chuàng)建的問題
簡單理解
供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類
我覺得跟工廠模式一樣闺金,只是不止一個抽象產(chǎn)品的而已
先對的幾個角色進(jìn)行說明:
- AbstractFactory:抽象工廠接口逾滥,里面應(yīng)該包含所有產(chǎn)品創(chuàng)建的抽象方法;
- ConcreteFactory1和ConcreteFactory2:具體的工廠败匹,創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對象寨昙;
- AbstractProductA和AbstractProductB:抽象產(chǎn)品个曙,它們可能有多種不同的實(shí)現(xiàn)方式吼砂;
- ProductA1、ProductA2铺峭、ProductB1和ProductB2:具體的產(chǎn)品槽棍,是抽象產(chǎn)品的具體實(shí)現(xiàn)捉蚤。
從結(jié)構(gòu)圖中可以看到,抽象工廠方法最大的好處是能夠很方便的變換產(chǎn)品系列(例如id<AbstractFactory> factory =[ [ConcreteFactory1 alloc] init]炼七,只需要將ConcreteFactory1換成ConcreteFactory2缆巧,就可以創(chuàng)建ProductA2和ProductB2)。另外豌拙,抽象工廠方法讓具體的創(chuàng)建實(shí)例過程與客戶端分離陕悬,客戶端是通過它們的抽象接口操作實(shí)例,產(chǎn)品的具體類名也被具體工廠的實(shí)現(xiàn)分離按傅,不會出現(xiàn)在客戶代碼中(例如id<AbstractProductA> product = [factory createProductA]捉超,客戶端根本不知道具體的類名是ProductA1還是ProductA2)。
但是逞敷,抽象工廠方法也是存在缺點(diǎn)的狂秦,比如說現(xiàn)在我們要增加一個新的產(chǎn)品,首先推捐,我們需要增加三個類:AbstractProductC裂问、ProductC1、ProductC2牛柒;另外堪簿,我們還需要更改三個類:AbstractFactory、ConcreteFactory1皮壁、ConcreteFactory2椭更,這樣,很明顯是違背開放-關(guān)閉原則蛾魄。這也是可以理解的虑瀑,沒有任何一個設(shè)計(jì)模式是完美沒有瑕疵的湿滓,這就好比世界上沒有打不敗的武功一樣。我們可以做的就是在實(shí)際的需求中舌狗,盡可能的將變化點(diǎn)進(jìn)行隔離叽奥,以達(dá)到變化發(fā)生的時候,對整個系統(tǒng)的影響最小痛侍,變化所帶來的變更和成本最低
``