三大工厂模式的优缺点
簡單工廠模式,工廠方法模式和抽象工廠模式都是屬于創(chuàng)建型設(shè)計(jì)模式,這三種創(chuàng)建型模式都不需要知道具體類。我們掌握一種思想,就是在創(chuàng)建一個(gè)對(duì)象時(shí),需要把容易發(fā)生變化的地方給封裝起來,來控制變化(哪里變化,封裝哪里),以適應(yīng)客戶的變動(dòng),項(xiàng)目的擴(kuò)展。用這三種設(shè)計(jì)模式都可以實(shí)現(xiàn),那究竟這三種設(shè)計(jì)模式有什么異同呢?下面根據(jù)這三者之間的特點(diǎn),優(yōu)點(diǎn),缺點(diǎn),適用范圍進(jìn)行比較。
一.特點(diǎn)
簡單工廠模式:專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。它又稱為靜態(tài)工廠方法模式。它的實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù),動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類(這些產(chǎn)品類繼承自一個(gè)父類或接口)的實(shí)例。簡單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例。在這個(gè)模式中,工廠類是整個(gè)模式的關(guān)鍵所在。它包含必要的判斷邏輯,能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象。用戶在使用時(shí)可以直接根據(jù)工廠類去創(chuàng)建所需的實(shí)例,而無需了解這些對(duì)象是如何創(chuàng)建以及如何組織的。有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。
工廠方法模式:工廠方法是粒度很小的設(shè)計(jì)模式,因?yàn)槟J降谋憩F(xiàn)只是一個(gè)抽象的方法。提前定義用于創(chuàng)建對(duì)象的接口,讓子類(具體工廠)決定實(shí)例化具體的某一個(gè)類,即在工廠和產(chǎn)品中間增加接口(抽象工廠),工廠不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,由接口針對(duì)不同條件返回具體的類實(shí)例,由具體類實(shí)例(具體工廠)去實(shí)現(xiàn)。工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實(shí)現(xiàn)ocp,實(shí)現(xiàn)了可擴(kuò)展。其次實(shí)現(xiàn)更復(fù)雜的層次結(jié)構(gòu),可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場(chǎng)合。工廠方法模式是對(duì)簡單工廠模式進(jìn)行了抽象。有一個(gè)抽象的Factory類(可以是抽象類和接口),這個(gè)類將不在負(fù)責(zé)具體的產(chǎn)品生產(chǎn),而是只制定一些規(guī)范,具體的生產(chǎn)工作由其子類去完成。在這個(gè)模式中,工廠類和產(chǎn)品類往往可以依次對(duì)應(yīng)。即一個(gè)抽象工廠對(duì)應(yīng)一個(gè)抽象產(chǎn)品,一個(gè)具體工廠對(duì)應(yīng)一個(gè)具體產(chǎn)品,這個(gè)具體的工廠就負(fù)責(zé)生產(chǎn)對(duì)應(yīng)的產(chǎn)品。
抽象工廠模式:抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠模式是指當(dāng)有多個(gè)抽象角色時(shí),使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個(gè)接口,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象。它有多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類,一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類,每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。每一個(gè)模式都是針對(duì)一定問題的解決方案,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu);而抽象工廠模式針對(duì)的是多個(gè)產(chǎn)品等級(jí)結(jié)果。
二.優(yōu)點(diǎn)
簡單工廠模式:工廠類含有必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任,而僅僅"消費(fèi)"產(chǎn)品。簡單工廠模式通過這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割。簡單工廠模式能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象。通過它,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面中擺脫出來。外界與具體類隔離開來,偶合性低。明確區(qū)分了各自的職責(zé)和權(quán)力,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。?????????????????
工廠方法模式:工廠方法模式是為了克服簡單工廠模式的缺點(diǎn)(主要是為了滿足OCP)而設(shè)計(jì)出來的。簡單工廠模式的工廠類隨著產(chǎn)品類的增加需要增加很多方法(或代碼),而工廠方法模式每個(gè)具體工廠類只完成單一任務(wù),代碼簡潔。工廠方法模式完全滿足OCP,即它有非常良好的擴(kuò)展性。????????????????????
抽象工廠模式:抽象工廠模式主要在于應(yīng)對(duì)“新系列”的需求變化。分離了具體的類,抽象工廠模式幫助你控制一個(gè)應(yīng)用創(chuàng)建的對(duì)象的類,因?yàn)橐粋€(gè)工廠封裝創(chuàng)建產(chǎn)品對(duì)象的責(zé)任和過程。它將客戶和類的實(shí)現(xiàn)分離,客戶通過他們的抽象接口操縱實(shí)例,產(chǎn)品的類名也在具體工廠的實(shí)現(xiàn)中被分離,它們不出現(xiàn)在客戶代碼中。它使得易于交換產(chǎn)品系列。一個(gè)具體工廠類在一個(gè)應(yīng)用中僅出現(xiàn)一次——即在它初始化的時(shí)候。這使得改變一個(gè)應(yīng)用的具體工廠變得很容易。它只需改變具體的工廠即可使用不同的產(chǎn)品配置,這是因?yàn)橐粋€(gè)抽象工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列,所以整個(gè)產(chǎn)品系列會(huì)立刻改變。它有利于產(chǎn)品的一致性。當(dāng)一個(gè)系列的產(chǎn)品對(duì)象被設(shè)計(jì)成一起工作時(shí),一個(gè)應(yīng)用一次只能使用同一個(gè)系列中的對(duì)象,這一點(diǎn)很重要,而抽象工廠很容易實(shí)現(xiàn)這一點(diǎn)。抽象工廠模式有助于這樣的團(tuán)隊(duì)的分工,降低了模塊間的耦合性,提高了團(tuán)隊(duì)開發(fā)效率。?????????????????????
三.缺點(diǎn)
簡單工廠模式:當(dāng)產(chǎn)品有復(fù)雜的多層等級(jí)結(jié)構(gòu)時(shí),工廠類只有自己,以不變應(yīng)萬變,就是模式的缺點(diǎn)。因?yàn)楣S類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦增加產(chǎn)品或者刪除產(chǎn)品,整個(gè)系統(tǒng)都要受到影響。系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,有可能造成工廠邏輯過于復(fù)雜,違背了"開放--封閉"原則(OCP).另外,簡單工廠模式通常使用靜態(tài)工廠方法,這使得無法由子類繼承,造成工廠角色無法形成基于繼承的等級(jí)結(jié)構(gòu)。?????????????????
工廠方法模式:假如某個(gè)具體產(chǎn)品類需要進(jìn)行一定的修改,很可能需要修改對(duì)應(yīng)的工廠類。當(dāng)同時(shí)需要修改多個(gè)產(chǎn)品類的時(shí)候,對(duì)工廠類的修改會(huì)變得相當(dāng)麻煩。比如說,每增加一個(gè)產(chǎn)品,相應(yīng)的也要增加一個(gè)子工廠,會(huì)加大了額外的開發(fā)量。? ? ? ? ? ? ? ? ??
抽象工廠模式:抽象工廠模式在于難于應(yīng)付“新對(duì)象”的需求變動(dòng)。難以支持新種類的產(chǎn)品。難以擴(kuò)展抽象工廠以生產(chǎn)新種類的產(chǎn)品。這是因?yàn)槌橄蠊S幾乎確定了可以被創(chuàng)建的產(chǎn)品集合,支持新種類的產(chǎn)品就需要擴(kuò)展該工廠接口,這將涉及抽象工廠類及其所有子類的改變。???????????????????
四.適用范圍
簡單工廠模式:工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少,客戶只知道傳入了工廠類的參數(shù),對(duì)于始何創(chuàng)建對(duì)象(邏輯)不關(guān)心。?????????????????????
工廠方法模式:當(dāng)一個(gè)類不知道它所必須創(chuàng)建對(duì)象的類或一個(gè)類希望由子類來指定它所創(chuàng)建的對(duì)象時(shí),當(dāng)類將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè),并且你希望將哪一個(gè)幫助子類是代理者這一信息局部化的時(shí)候,可以使用工廠方法,支持多擴(kuò)展少修改的OCP原則。?????????????????????
抽象工廠模式:一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對(duì)于所有形態(tài)的工廠模式都是重要的。這個(gè)系統(tǒng)有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一產(chǎn)品族。同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來。系統(tǒng)提供一個(gè)產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實(shí)現(xiàn)。?????????????????
其實(shí),無論是簡單工廠模式、工廠模式還是抽象工廠模式,它們本質(zhì)上都是將不變的部分提取出來,將可變的部分留作接口,以達(dá)到最大程度上的復(fù)用。究竟用哪種設(shè)計(jì)模式更適合,這要根據(jù)具體的業(yè)務(wù)需求來決定。
?
總結(jié)
以上是生活随笔為你收集整理的三大工厂模式的优缺点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络:forward和redirect的
- 下一篇: redis: string类型设置过期时