抽象工廠模式

2021-10-22 22:13:40 字數 2958 閱讀 8653

抽象工廠可以看成是由於產品類又被抽象的結果,在工廠模式中工廠能生產一種產品類(產品簇)的一系列產品,但是如果每乙個產品類又有著進一步的分類便需要進一步抽象,例如工廠能生產多種程式設計師,但是每個程式設計師又有了程式設計師主體和程式設計師細節的劃分,便需要抽象工廠了

角色劃分

productapi:生產者api,用於定義生產者的行為規範,即抽象介面

concreteproduct:生產者角色,具體已經實現介面的生產者

productfactory:抽象的工廠,建立不同產品類的工廠(位元組類和阿里類)

concretefactory:具體的工廠,負責具體的某個產品類的產品的加工(程式設計師1和程式設計師2)

client:消費者,需要使用具體的某個生產者

**實現

productapi類

public

inte***ce

programmerdetail

public

inte***ce

programmer

productrole

public

class

programmer1

implements

programmer

}

public

class

programmer2

implements

programmer

}

public

class

programmer1detail

implements

programmerdetail

}

public

class

programmer2detail

implements

programmerdetail

}

productfactory

public

abstract

class

programme***ctory

concretefactory(具體的工廠)

public

class

programmer1factory

extends

programme***ctory

@override

public programmerdetail getdetail()

}

public

class

programmer2factory

extends

programme***ctory

@override

public programmerdetail getdetail()

}

client(用於測試的消費者1)

事實上我這個例子也舉的不太友好,下面再拿個《研磨設計模式》中的例子解釋下

有兩個產品類訂單主體和訂單細節,兩個產品簇資料庫儲存和xml儲存

擴充套件產品簇時很容易比如再加個本地快取儲存,直接寫個cachefactory實現daofactory介面,然後完善兩個方法

擴充套件產品類就不容易了,比如再加個訂單簡介,那麼所有的子類factory都需要實現乙個新方法

優點使得切換產品簇變得容易

因為乙個具體的工廠實現代表的是乙個產品簇,比如上面例子的程式設計師中程式設計師1代表方案一:程式設計師1的日常生活和細節生活,如果要切換成為程式設計師2,那就變成了方案二:程式設計師2的日常生活和細節生活

客戶端選用不同的工廠實現,就相當於是在切換不同的產品簇

缺點切換產品簇容易,但是擴充套件產品簇下的新產品便不容易,比如再擴充套件乙個programmerprivacy(程式設計師隱私)介面,那麼抽象工廠需要增加乙個抽象方法返回該類,那麼抽象類的所有子類都需要多加乙個方法

在使用抽象工廠模式的時候,如果需要選擇的層次過多,那麼會造成整個類層次變得複雜,也就是產品簇上還有產品簇,有點套娃的意思,層次多了非常容易出錯

筆者關於這裡的區別確實是思考了很久不得解,知道看了jdk原始碼的設計模式才恍然大悟(jdk才是永遠的神)

在calendar中可以看出工廠模式的工廠也能有多個方法,但是這些方法返回值大多是乙個物件,即使不是大多目的也是為了更好的建立那乙個物件(比如calendar中有大量返回內部類builder的方法,builder也是用來更好的建立calendar的),所以工廠類的職責自始至終都是專注於建立乙個物件;然而我們來看抽象工廠卻不是這樣,抽象工廠的每個方法都可以是不同的物件,也就是說抽象工廠類的職責是建立多個物件。如果說工廠模式是用多種方法來完善乙個產品類,那麼抽象工廠使用多種方法建立多個產品來完善乙個產品簇

理解了這個,不難想到,我們還可以將抽象工廠與工廠方法結合使用,將抽象工廠的乙個子類工廠當成工廠模式的抽象工廠再拋給子類去實現,比如將上文的rdbdaofactory做成抽象的,寫兩個子類rdbordermainfactory和rdborderdetailfactory,兩個子類專注於乙個產品的建立。當然這樣做像套娃一樣,系統複雜度會提高很多,一定要結合業務,且行且珍惜

當抽象工廠模式只需要加工乙個產品,即只有乙個方法,那麼事實上就退化成了工廠模式而已

如果乙個系統要由多個產品系列中的乙個來配置的時候。換句話說,就是可以動態地切換產品簇的時候使用

總的來說抽象工廠更重視有著多個產品簇的劃分,每個產品簇都有著自己的多個產品

抽象工廠模式 抽象工廠模式

抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...

工廠模式 抽象工廠模式

這裡使用簡單的話來講解工廠模式,不涉及程式設計 什麼是工廠模式呢?我的理解是對抽象介面例項的封裝。假如有乙個介面,有若干的實現類,代表不同的例項。傳統產生物件的方法是直接new乙個出來,對於每個例項都要new,當實現介面的類較多時會很麻煩,並且類的實現也暴露出來了。工廠模式是一種產生物件的模式,使用...

工廠模式 抽象工廠模式

子類父類代換 場景 在不同的條件下,需要建立不同的實現子類時。如網路通訊可以使用tcp udp。可以實現同乙個介面,通過工廠類根據條件 tcp或udp 來例項化不同的子類。這些子類符合黎克特制代換原則。public inte ce tlprotocol public class tcpimpleme...