Builder模式和工廠模式的區別

2021-10-02 03:52:23 字數 2306 閱讀 7546

在這個過程中,有乙個相似的特點,就是這些builder會讀取檔案或者配置,然後做大量的xpathparser解析、配置或語法的解析、反射生成物件、存入結果快取等步驟,這麼多的工作都不是乙個建構函式所能包括的,因此大量採用了builder模式來解決。

對於builder的具體類,方法都大都用build*開頭,比如sqlsessionfactorybuilder為例,它包含以下方法:

即根據不同的輸入引數來構建sqlsessionfactory這個工廠物件。

在mybatis中比如sqlsessionfactory使用的是工廠模式,該工廠沒有那麼複雜的邏輯,是乙個簡單工廠模式。

在defaultsqlsessionfactory的預設工廠實現裡,有乙個方法可以看出工廠怎麼產出乙個產品:

private sqlsession opensessionfromdatasource

(executortype exectype, transactionisolationlevel level,

boolean autocommit)

catch

(exception e)

finally

}

這是乙個opensession呼叫的底層方法,該方法先從configuration讀取對應的環境配置,然後初始化transactionfactory獲得乙個transaction物件,然後通過transaction獲取乙個executor物件,最後通過configuration、executor、是否autocommit三個引數構建了sqlsession。

在這裡其實也可以看到端倪,sqlsession的執行,其實是委託給對應的executor來進行的。

而對於logfactory,它的實現**:

public

final classlogfactory

publicstatic log getlog

(class<

?> aclass)

這裡有個特別的地方,是log變數的的型別是constructor extends log>,也就是說該工廠生產的不只是乙個產品,而是具有log公共介面的一系列產品,比如log4jimpl、slf4jimpl等很多具體的log。

factory模式一進一出,builder模式是分步流水線作業。當你需要做一系列有序的工作或者按照一定的邏輯來完成建立乙個物件時 builder就派上用場啦。我們可以看到,builer模式與工廠模式是極為相似的,但是他們還是有區別的:

一、從結構上來看,builder模式比工廠模式多了乙個「導演類」的角色。在builder模式的類圖中,假如把這個導演類看做是最終呼叫的客戶端,那麼圖中剩餘的部分就可以看作是乙個簡單的工廠模式了。

二、兩者所建立的產品型別完全不一樣。factory建立只能是單一的產品(單一在這指它非復合產品),而builder所建立的產品是復合產品,即產品本身就是由其它部件產品組成的。舉個例子來說,現在要生產一輛車,假設它就只由這三個部分組成:玻璃、輪子、發動機。對於工廠模式來說,他建立後返回的,只能是玻璃,或者輪子,抑或是發動機。不管怎麼樣,他不能向客戶返回一輛完整的汽車,要得到一輛完整的汽車,客戶必須自己動手去把這些零部件組裝成一輛汽車。從這個意義上來講,工廠模式中的工廠,只是充當了零件廠的角色。那builder又是如何建立產品的呢?在builder模式中,一般不需要、也不充許向客戶返回單個部件,他向客戶返回的,僅僅就是一部已經完全組裝好的汽車成品。對於汽車部件的生產細節,客戶不需要、也不應該讓他們知道。

寫到這,我突然想到了組裝電腦與品牌電腦的差別,組裝電腦雖然**便宜,且易於改動,但效能沒***,另外你自己還必須了解很多有關電腦方面的知識;對於品牌電腦,**貴這點先暫時不說,關鍵在於他不靈活,但是它的效能可以得到很好保證(由廠家),這易像我們在builder的系統端保證部件的質量一樣。另外,對於品牌電腦,客戶根本不需要了解多少電腦組裝方面的知識,就可以把一台電腦抱回家,開機使用了。那麼,在實際運用中,你是喜歡做diy一族呢,還是喜歡穩定***的質量呢?好像在我們程式設計的這個過程中,我們比較趨向於使用「品牌電腦」。這也就為我們正確使用這兩種設計模式提供了乙個方向:如果你要生產的產品是由不同部件組成的,你最好使用builder模式,而非factory模式。

三、builder和factory的差別,還在於他們所生產部件產品所在產品樹的問題。這樣說,可能有點拗口。具體來說吧,在工廠模式中,我們知道,乙個工廠可以建立多個產品,但乙個工廠模式中所建立的某個產品,都會和另乙個工廠中所建立的產品在同一棵繼承樹上。builder可以建立出可以建立出風馬不相及的產品(雖然我們不這麼做),但是factory模式一般是建立一類產品。

抽象工廠和Builder模式區別

1 側重產品生成結果,側重產品過程 2 後者測試相同過程的產生,或有序列的生產過程 3 後面有相同的生產過程,用於被建立的物件之間有緊密的關係,前者一般不需要 因此核心要點在於 builder需要有相同的生產過程,且有部件需要生產,而工廠模式一般沒有,更側重生產結果。最近要參加面試,於是乎又把設計模...

設計模式 Builder模式

bulder模式是一步步建立乙個複雜物件的建立模型,它允許使用者在不知道內部構建細節 的情況下可以更精細地控制物件的構造流程該模式為將構建複雜物件的過程和它的部件 解耦,使得構建過程和部件的表示隔離開來。將乙個負責物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示 3.1 相同的方法,不...

設計模式 Builder模式

網路上有人將它定義為 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的物件。所以建造者模式適合於乙個具有較多的零件 屬性 的產品 物件 的建立過程。由五個部分構成 1.product concreatebuilder建立該產品的內部表示並定義它的裝配過程。2.builder介面 ...