本文主要論述了以下幾方面:

  1.總論

  2.簡(jiǎn)單工廠模式

  3.工廠方法模式

  4.抽象工廠模式

1.總論

  在工廠設(shè)計(jì)模式中,客戶端可以請(qǐng)求一個(gè)對(duì)象,而無需知道這個(gè)對(duì)象來自哪里;也就是說,使用哪個(gè)類來生成這個(gè)對(duì)象。工廠背后的思想是簡(jiǎn)化對(duì)象的創(chuàng)建。與客戶端自己基于類實(shí)例化直接創(chuàng)建對(duì)象相比,基于一個(gè)中心化函數(shù)來實(shí)現(xiàn),更易于追蹤創(chuàng)建了哪些對(duì)象。通過將創(chuàng)建對(duì)象的代碼和使用對(duì)象的代碼解耦,工廠能夠降低應(yīng)用維護(hù)的復(fù)雜度。
  工廠通常有兩種形式:一種是工廠方法( Factory Method),它是一個(gè)方法,對(duì)不同的輸入?yún)?shù)返回不同的對(duì)象;第二種是抽象工廠,它是一組用于創(chuàng)建一系列相關(guān)事物對(duì)象的工廠方法。
  工廠模式分類:

  • 簡(jiǎn)單工廠模式

  • 工廠方法

  • 抽象工廠

  這三種模式從上到下逐步抽象,并且更具一般性。 
  三者區(qū)別:
    工廠方法模式:簡(jiǎn)單工廠模式可視為工廠方法的一種特例。一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體產(chǎn)品類。 一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。 每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例。
    抽象工廠模式:多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類。 一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。 每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。 
  總結(jié):
  工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)。 
  工廠方法模式的具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。

2.簡(jiǎn)單工廠模式

  建立一個(gè)一個(gè)工廠來制造新的對(duì)象。它存在的目的很簡(jiǎn)單:定義一個(gè)用于創(chuàng)建對(duì)象的接口。 

  按照面向過程的習(xí)慣,可能直接在客戶端中根據(jù)條件來創(chuàng)建不同的具體產(chǎn)品實(shí)例;對(duì)于簡(jiǎn)單工廠模式而言,是把這部分邏輯抽象出來,放在一個(gè)工廠類中,由工廠類負(fù)責(zé)產(chǎn)生具體的對(duì)象,也就是將生產(chǎn)者和消費(fèi)者分離了。

  簡(jiǎn)單工廠模式,通過專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建具體類型的實(shí)例,要?jiǎng)?chuàng)建的實(shí)例一般繼承自同一個(gè)類;

  結(jié)構(gòu)一般如下所示:

      photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

 

  如上所示,工廠模式中的角色一般包括:

  工廠角色:即上圖中的OperationFactory,它可以被客戶端調(diào)用,其內(nèi)部負(fù)責(zé)創(chuàng)建具體的對(duì)象;

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

class OperationFactory:  # 定義一個(gè)工廠,根據(jù)用戶輸入來生產(chǎn)實(shí)例對(duì)象
    operator = {}
    operator["+"] = OperationAdd()
    operator["-"] = OperationSub()
    operator["*"] = OperationMul()
    operator["/"] = OperationDiv()    def createOperation(self, ch):        if ch in self.operator:
            op = self.operator[ch]        else:
            op = OperationUndef()        return op

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

  抽象產(chǎn)品類:即上圖中的抽象類Operation,它描述了所有實(shí)例公共的接口;

class Operation:  # 基類,所有操作類都從此類繼承
    def GetResult(self):        pass

  具體產(chǎn)品類:即上圖中的OperationAdd等,實(shí)現(xiàn)抽象產(chǎn)品的接口,是工廠角色中要?jiǎng)?chuàng)建的具體實(shí)例

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

class OperationAdd(Operation):  # 加法類
    def GetResult(self):        return self.op1 + self.op2class OperationSub(Operation):   # 減法類
    def GetResult(self):        return self.op1 - self.op2class OperationMul(Operation):  # 乘法類
    def GetResult(self):        return self.op1 * self.op2class OperationDiv(Operation):  # 除法類
    def GetResult(self):        try:
            result = self.op1 / self.op2            return result        except ZeroDivisionError as e:            print("error:divided by zero.",e)            return 0

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

  主函數(shù)實(shí)現(xiàn):

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)主函數(shù)

  簡(jiǎn)單工廠優(yōu)缺點(diǎn)總結(jié):

    優(yōu)點(diǎn):從上面的描述可以看出,工廠角色負(fù)責(zé)產(chǎn)生具體的實(shí)例對(duì)象,所以在工廠類中需要有必要的邏輯,通過客戶的輸入能夠得到具體創(chuàng)建的實(shí)例;所以客戶端就不需要感知具體對(duì)象是怎么產(chǎn)生的,只需要將必要的信息提供給工廠即可;

    缺點(diǎn):簡(jiǎn)單工廠模式是違反“開閉原則”,即對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉;因?yàn)槿绻略鼍唧w產(chǎn)品,就需要修改工廠類的代碼;

  下面我們從開閉原則上來分析下簡(jiǎn)單工廠模式。當(dāng)客戶不再滿足現(xiàn)有功能的時(shí)候,想要一個(gè)開方操作,只要這種操作符合抽象產(chǎn)品制定的合同,那么只要通知工廠類知道就可以被客戶使用了。所以對(duì)產(chǎn)品部分來說,它是符合開閉原則的;但是工廠部分好像不太理想,因?yàn)槊吭黾右环N操作,都要在工廠類(OperationFactory)中增加相應(yīng)的創(chuàng)建業(yè)務(wù)邏輯(方法需要新增case來判斷創(chuàng)建什么樣的操作),這顯然是違背開閉原則的??上攵獙?duì)于新產(chǎn)品的加入,工廠類是很被動(dòng)的。對(duì)于這樣的工廠類,我們稱它為全能類 或者上帝類。 

  我們舉的例子是最簡(jiǎn)單的情況,而在實(shí)際應(yīng)用中,很可能產(chǎn)品是一個(gè)多層次的樹狀結(jié)構(gòu)。由于簡(jiǎn)單工廠模式中只有一個(gè)工廠類來對(duì)應(yīng)這些產(chǎn)品,所以這可能會(huì)把我們的上帝累壞了,也累壞了我們這些程序員。于是工廠方法模式作為救世主出現(xiàn)了。 工廠類定義成了接口,而每新增的操作,就增加該種類型對(duì)應(yīng)工廠類的實(shí)現(xiàn),這樣工廠的設(shè)計(jì)就可以擴(kuò)展了,而不必去修改原來的代碼。

3.工廠方法模式

  工廠方法模式:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法讓類把實(shí)例化推遲到了子類。

  對(duì)于簡(jiǎn)單工廠而言,創(chuàng)建對(duì)象的邏輯判斷放在了工廠類中,客戶不感知具體的類,但是工廠類違反了開閉原則,如果要新增新的具體類,就必須修改工廠類;

  對(duì)于工廠模式而言,是通過擴(kuò)展來新增具體類的,但是在客戶端就必須感知到具體的類了,要通過具體類的創(chuàng)建工廠來創(chuàng)建具體的實(shí)例,也就是判斷邏輯由簡(jiǎn)單工廠的工廠類挪到了客戶端中;

  工廠模式橫向擴(kuò)展很方便;

  結(jié)構(gòu)一般如下所示:

    photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

  工廠方法模式組成: 
  1)抽象工廠角色: 這是工廠方法模式的核心,它與應(yīng)用程序無關(guān)。是具體工廠角色必須實(shí)現(xiàn)的接口或者必須繼承的父類。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)抽象工廠

  2)具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對(duì)應(yīng)的具體產(chǎn)品的對(duì)象。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)具體工廠

  3)抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類或者是實(shí)現(xiàn)的接口。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)View Code

  4)具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對(duì)象就是此角色的實(shí)例。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)具體產(chǎn)品

  主函數(shù)實(shí)現(xiàn):

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)主函數(shù)

  這個(gè)和簡(jiǎn)單工廠有區(qū)別,簡(jiǎn)單工廠模式只有一個(gè)工廠,工廠方法模式對(duì)每一個(gè)產(chǎn)品都有相應(yīng)的工廠。

  

  工廠方法模式使用繼承自抽象工廠角色的多個(gè)子類來代替簡(jiǎn)單工廠模式中的“上帝類”。正如上面所說,這樣便分擔(dān)了對(duì)象承受的壓力;而且這樣使得結(jié)構(gòu)變得靈活起來——當(dāng)有新的產(chǎn)品產(chǎn)生時(shí),只要按照抽象產(chǎn)品角色、抽象工廠角色提供的合同來生成,那么就可以被客戶使用,而不必去修改任何已有 的代碼。可以看出工廠角色的結(jié)構(gòu)也是符合開閉原則的! 

   工廠方法模式優(yōu)缺點(diǎn)總結(jié):

    優(yōu)點(diǎn):1.增加一個(gè)產(chǎn)品,只需要增加產(chǎn)品類和對(duì)應(yīng)的工廠類,而不必修改總的工廠類。可以使代碼結(jié)構(gòu)清晰,有效地封裝變化。

       2.對(duì)調(diào)用者屏蔽具體的產(chǎn)品類。如果使用工廠模式,調(diào)用者只關(guān)心產(chǎn)品的接口就可以了,至于具體的實(shí)現(xiàn),調(diào)用者根本無需關(guān)心。即使變更了具體的實(shí)現(xiàn),對(duì)調(diào)用者來說沒有任何影響。

       3.降低耦合度。產(chǎn)品類的實(shí)例化通常來說是很復(fù)雜的,它需要依賴很多的類,而這些類對(duì)于調(diào)用者來說根本無需知道,如果使用了工廠方法,我們需要做的僅僅是實(shí)例化好產(chǎn)品類,然后交給調(diào)用者使用。對(duì)調(diào)用者來說,產(chǎn)品所依賴的類都是透明的。

    缺點(diǎn):增加新的產(chǎn)品類,會(huì)修改客戶端代碼,工廠方法只是把簡(jiǎn)單工廠的內(nèi)部邏輯判斷移到了客戶端進(jìn)行。簡(jiǎn)單對(duì)象,特別是只需要通過new就可以完成創(chuàng)建的對(duì)象,無需使用工廠模式。如果使用工廠模式,就需要引入一個(gè)工廠類,會(huì)增加系統(tǒng)的復(fù)雜度。

   可以看出工廠方法的加入,使得對(duì)象的數(shù)量成倍增長。當(dāng)產(chǎn)品種類非常多時(shí),會(huì)出現(xiàn)大量的與之對(duì)應(yīng)的工廠對(duì)象,這不是我們所希望的。因?yàn)槿绻荒鼙苊膺@種情 況,可以考慮使用簡(jiǎn)單工廠模式與工廠方法模式相結(jié)合的方式來減少工廠類:即對(duì)于產(chǎn)品樹上類似的種類(一般是樹的葉子中互為兄弟的)使用簡(jiǎn)單工廠模式來實(shí) 現(xiàn)。

  工廠方法模式應(yīng)用場(chǎng)景:

  •   當(dāng)客戶程序不需要知道要使用對(duì)象的創(chuàng)建過程。 

  •      客戶程序使用的對(duì)象存在變動(dòng)的可能,或者根本就不知道使用哪一個(gè)具體的對(duì)象。

  •      工廠模式是一種典型的解耦模式,迪米特法則在工廠模式中表現(xiàn)的尤為明顯。假如調(diào)用者自己組裝產(chǎn)品需要增加依賴關(guān)系時(shí),可以考慮使用工廠模式。將會(huì)大大降低對(duì)象之間的耦合度。

  •      當(dāng)需要系統(tǒng)有比較好的擴(kuò)展性時(shí),可以考慮工廠模式,不同的產(chǎn)品用不同的實(shí)現(xiàn)工廠來組裝。

4.抽象工廠模式  

  抽象工廠設(shè)計(jì)模式是抽象方法的一種泛化。概括來說,一個(gè)抽象工廠是(邏輯上的)一組工廠方法,其中的每個(gè)工廠方法負(fù)責(zé)產(chǎn)生不同種類的對(duì)象。

  可以說,抽象工廠模式和工廠方法模式的區(qū)別就在于需要?jiǎng)?chuàng)建對(duì)象的復(fù)雜程度上。而且抽象工廠模式是三個(gè)里面最為抽象、最具一般性的。 
  抽象工廠模式的用意為:給客戶端提供一個(gè)接口,可以創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象 ,而且使用抽象工廠模式還要滿足一下條件:

  •      系統(tǒng)中有多個(gè)產(chǎn)品族,而系統(tǒng)一次只可能消費(fèi)其中一族產(chǎn)品。 

  •      同屬于同一個(gè)產(chǎn)品族的產(chǎn)品以其使用。

 抽象工廠模式與工廠方法模式的區(qū)別:

  抽象工廠模式是工廠方法模式的升級(jí)版本,他用來創(chuàng)建一組相關(guān)或者相互依賴的對(duì)象。他與工廠方法模式的區(qū)別就在于,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu);而抽象工廠模式則是針對(duì)的多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。在編程中,通常一個(gè)產(chǎn)品結(jié)構(gòu),表現(xiàn)為一個(gè)接口或者抽象類,也就是說,工廠方法模式提供的所有產(chǎn)品都是衍生自同一個(gè)接口或抽象類,而抽象工廠模式所提供的產(chǎn)品則是衍生自不同的接口或抽象類。

        在抽象工廠模式中,有一個(gè)產(chǎn)品族的概念:所謂的產(chǎn)品族,是指位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中功能相關(guān)聯(lián)的產(chǎn)品組成的家族抽象工廠模式所提供的一系列產(chǎn)品就組成一個(gè)產(chǎn)品族;而工廠方法提供的一系列產(chǎn)品稱為一個(gè)等級(jí)結(jié)構(gòu)。我們拿生產(chǎn)汽車的例子來說明他們之間的區(qū)別。

  photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

  在上面的類圖中,兩廂車和三廂車稱為兩個(gè)不同的等級(jí)結(jié)構(gòu);而2.0排量車和2.4排量車則稱為兩個(gè)不同的產(chǎn)品族。再具體一點(diǎn),2.0排量?jī)蓭嚭?.4排量?jī)蓭噷儆谕粋€(gè)等級(jí)結(jié)構(gòu),2.0排量三廂車和2.4排量三廂車屬于另一個(gè)等級(jí)結(jié)構(gòu);而2.0排量?jī)蓭嚭?.0排量三廂車屬于同一個(gè)產(chǎn)品族,2.4排量?jī)蓭嚭?.4排量三廂車屬于另一個(gè)產(chǎn)品族。

        明白了等級(jí)結(jié)構(gòu)和產(chǎn)品族的概念,就理解工廠方法模式和抽象工廠模式的區(qū)別了,如果工廠的產(chǎn)品全部屬于同一個(gè)等級(jí)結(jié)構(gòu),則屬于工廠方法模式;如果工廠的產(chǎn)品來自多個(gè)等級(jí)結(jié)構(gòu),則屬于抽象工廠模式。在本例中,如果一個(gè)工廠模式提供2.0排量?jī)蓭嚭?.4排量?jī)蓭嚕敲此麑儆诠S方法模式;如果一個(gè)工廠模式是提供2.4排量?jī)蓭嚭?.4排量三廂車兩個(gè)產(chǎn)品,那么這個(gè)工廠模式就是抽象工廠模式,因?yàn)樗峁┑漠a(chǎn)品是分屬兩個(gè)不同的等級(jí)結(jié)構(gòu)。當(dāng)然,如果一個(gè)工廠提供全部四種車型的產(chǎn)品,因?yàn)楫a(chǎn)品分屬兩個(gè)等級(jí)結(jié)構(gòu),他當(dāng)然也屬于抽象工廠模式了。

  結(jié)構(gòu)一般如下所示:

    photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

 抽象工廠模式的各個(gè)角色(和工廠方法一樣): 

  •      抽象工廠角色: 這是工廠方法模式的核心,它與應(yīng)用程序無關(guān)。是具體工廠角色必須實(shí)現(xiàn)的接口或者必須繼承的父類。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)抽象工廠角色

  •   具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對(duì)應(yīng)的具體產(chǎn)品的對(duì)象。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)具體工廠角色

  •      抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類或者是實(shí)現(xiàn)的接口。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)抽象產(chǎn)品角色A

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)抽象產(chǎn)品角色B

  •      具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對(duì)象就是此角色的實(shí)例。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)具體產(chǎn)品角色A

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)具體產(chǎn)品角色B

  主函數(shù)實(shí)現(xiàn):

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)主函數(shù)

 抽象工廠模式的優(yōu)缺點(diǎn):

  優(yōu)點(diǎn): 抽象工廠模式除了具有工廠方法模式的優(yōu)點(diǎn)外,最主要的優(yōu)點(diǎn)就是可以在類的內(nèi)部對(duì)產(chǎn)品族進(jìn)行約束。所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián),抽象工廠模式就可以在類內(nèi)部對(duì)產(chǎn)品族的關(guān)聯(lián)關(guān)系進(jìn)行定義和描述,而不必專門引入一個(gè)新的類來進(jìn)行管理。

  缺點(diǎn):產(chǎn)品族的擴(kuò)展將是一件十分費(fèi)力的事情,假如產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品,則幾乎所有的工廠類都需要進(jìn)行修改。所以使用抽象工廠模式時(shí),對(duì)產(chǎn)品等級(jí)結(jié)構(gòu)的劃分是非常重要的。

  適用場(chǎng)景:

   當(dāng)需要?jiǎng)?chuàng)建的對(duì)象是一系列相互關(guān)聯(lián)或相互依賴的產(chǎn)品族時(shí),便可以使用抽象工廠模式。說的更明白一點(diǎn),就是一個(gè)繼承體系中,如果存在著多個(gè)等級(jí)結(jié)構(gòu)(即存在著多個(gè)抽象類),并且分屬各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間存在著一定的關(guān)聯(lián)或者約束,就可以使用抽象工廠模式。假如各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間不存在關(guān)聯(lián)或約束,則使用多個(gè)獨(dú)立的工廠來對(duì)產(chǎn)品進(jìn)行創(chuàng)建,則更合適一點(diǎn)。

 總結(jié),無論是簡(jiǎn)單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬于工廠模式,在形式和特點(diǎn)上也是極為相似的,他們的最終目的都是為了解耦。在使用時(shí),我們不必去在意這個(gè)模式到底工廠方法模式還是抽象工廠模式,因?yàn)樗麄冎g的演變常常是令人琢磨不透的。經(jīng)常你會(huì)發(fā)現(xiàn),明明使用的工廠方法模式,當(dāng)新需求來臨,稍加修改,加入了一個(gè)新方法后,由于類中的產(chǎn)品構(gòu)成了不同等級(jí)結(jié)構(gòu)中的產(chǎn)品族,它就變成抽象工廠模式了;而對(duì)于抽象工廠模式,當(dāng)減少一個(gè)方法使的提供的產(chǎn)品不再構(gòu)成產(chǎn)品族之后,它就演變成了工廠方法模式。

       所以,在使用工廠模式時(shí),只需要關(guān)心降低耦合度的目的是否達(dá)到了。

 

http://www.cnblogs.com/vipchenwei/p/7096266.html