抽象工廠和Builder模式區別

2021-05-27 07:36:38 字數 2972 閱讀 3887

(1)側重產品生成結果,側重產品過程

(2)後者測試相同過程的產生,或有序列的生產過程

(3)後面有相同的生產過程,用於被建立的物件之間有緊密的關係,前者一般不需要

因此核心要點在於:builder需要有相同的生產過程,且有部件需要生產,而工廠模式一般沒有,更側重生產結果。

最近要參加面試,於是乎又把設計模式拿出來過了一遍.由於每次在看到抽象工廠和builder模式的時候總是有點迷糊,因此這次下了狠心,翻箱倒櫃的找出英文版教材,中英對照,希望能把這兩種模式搞清楚.

所有的建立型模式的本質目的都是為了更好的建立物件,抽象工廠和builder模式也是如此,另外,兩種模式還有乙個共同的特點,就是將物件建立過程與使用過程相分離,使用者在使用時只需知道該建立什麼,而無需知道物件是究竟如何建立的.這樣物件建立和使用的過程之間就呈現一種松耦合的形式,當建立過程有改動的時候只需對建立過程進行無需對使用過程作出任何修改.除此之外,兩種模式同樣都是被用於將部件物件構造成乙個完整的物件.舉個例子,某工廠生產ibm電腦和hp電腦,兩種電腦的配置不相同,但都是由cpu、主機板、記憶體、硬碟等部件構成,工廠模式和builder模式都可以根據不同的配置生成ibm電腦或者hp電腦。

兩種模式的共同點使得在剛剛開始學習的時候,非常容易混淆,其實仔細研究,兩者之間的區別也是非常明顯的,而我認為兩者之間最本質的區別是,抽象工廠通過不同的構建過程生成不同的物件表示,而builder模式通過相同的構建過程生成不同的表示。

builder 也是乙個高層建築,但是他和abstract factory側重點不同,abstract factory側重於建立東西的結果,而builder側重的是建立東西的過程。當你需要做一系列有序的工作來完成建立乙個物件時   builder就派上用場啦

上面的文字比較抽象,下面舉個例子說明。

假設有具體工廠類ibmfactory,hpfactory和具體物件類ibm,hp,其中工廠類繼承自abstractfactory類,工廠類實現方法getproduct(),具體物件類繼承自computer類,物件類實現方法attach()用於裝配不同部件,設部件都繼承自基類component,演示**如下:

abstract class abstractfactory //工廠基類

...class ibmfactory:abstractfactory //生產ibm電腦

...}

class hpfactory:abstractfactory() //生產hp電腦

...}

abstract class computer //基類

...class ibm:computer

...

}class hp:computer

...

}使用的過程如下:

ibmfactory ibmfactory=new ibmfactory(); //例項化ibm工廠

ibm ibm=(ibm)ibmfactory.getproduct(); //生成ibm物件

hpfactory hpfactory=new hpfactory(); //例項化hp工廠

hp hp=(hp)hpfactory.getproduct(); //生成hp物件

從上面**可以產出,ibm電腦的構建過程是由ibmfacotry實現的,而hp的構建過程是由hpfactory實現的,當我想要生產某種計算機的時候需要首先例項化對應的工廠,然後通過工廠的getproduct()方法裝配出需要的物件。

也即,建立不同的物件需要不同的建立過程。

下面再來看,採用builder模式是如何描述上述生產過程的。在builder模式中有兩個重要的物件,乙個叫做builder,乙個叫做director,其中builder物件負責描述物件的構造細節,director負責構造完整的物件。假設有具體builder類ibmbuilder,hpbuilder以及director類director,其中builder類物件的基類為builder,builder中有方法building(),director類有方法construct()和getcomputer()方法,**如下:

computer,ibm,hp類描述同上。

abstract class builder //建立著基類

...class ibmbuilder //ibm物件的建立者

...}

class hpbuilder //hp物件的建立者

...}

class director //指導者類

...public computer getcomputer() //獲取已經建立好的物件

...}

使用過程如下:

ibmbuilder ibmbuilder=new ibmbuilder(); //例項化ibm建立者物件

hpbuilder hpbuilder=new hpbuilder(); //例項化hp建立者物件

director director=new director(); //例項化建立者物件

director.construct(ibmbuilder); //建立ibm物件

ibm ibm=(ibm)director.getcomputer(); //獲取ibm物件

irector.construct(hpbuilder); //建立hp物件

hp hp=(hp)director.getcomputer(); //獲取hp物件

從上面**可以看出,ibm和hp物件的建立過程均有director的constuct()實現,只要設定不同的builder,就可以建立不同的物件。也即,用相同的建立過程建立不同的物件。

直觀上的感覺,builder模式是抽象工廠模式的再封裝,不但實現了建立過程的隱藏,甚至連建立過程該有那個方法實現都不必再去考慮,這樣我們可以更加黑盒的去構建不同的物件。但事實上,兩種模式有本質的區別,builder模式的使用前提是被建立的物件之間有緊密的關係,屬於同一類物件,當組成物件型別不同的時候,builder模式就顯得力不從心了,這是就需要配合抽象工廠模式來構建由不同型別的物件構成的物件了。

工廠模式和抽象工廠模式

當client不知道要建立哪乙個具體類的例項,或者不想在client 中指明要具體建立的例項 換句話說就是計畫在不同條件下建立不同的例項。在這種情況下,適合使用個工廠模式。工廠模式可以視作是乙個虛擬的構造器,主要思路是定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲...

Builder模式和工廠模式的區別

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

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

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