設計模式 工廠模式

2021-08-13 18:44:24 字數 3512 閱讀 6895

一、什麼是工廠模式?

工廠模式就是建立乙個物件的工廠介面,建立物件不再是通過new這個物件來直接實現,而是通過工廠來對物件進行建立。應用工廠模式可以降低系統間的耦合度。

工廠模式中一般有以下角色:

1. 抽象產品類:是具體產品物件的基類

2. 具體產品類:實現了抽象產品類介面,每乙個具體產品類都會對應乙個工廠

3. 抽象工廠:工廠模式的基類,定義了工廠類必須實現的介面

4. 具體工廠:實現了抽象工廠類的介面,是與客戶端直接互動的類,負責具體的產品物件的建立

我們平時都是通過new來建立乙個物件例項的,假設我們在多個方法中都對類a進行了例項化,而現在我們需要對a做一點改動,比如我們要修改a的構造方法的入參,那麼接下來會發生什麼?那就是我們需要修改所有例項化a類的**,這個改動量無疑是巨大的,而且我們也不保證在改動的過程中不會出錯。這樣的一種物件建立模式無疑違反了設計模式中的「開放關閉原則」(即對擴充套件開放,對修改關閉)。這個時候應用工廠模式就是很合適的,物件例項是通過工廠來建立的,如果我們要修改或者擴充套件類a,我們不再需要修改所有例項化a的地方,而只是需要修改對應的工廠類即可。

工廠模式分有兩種,簡單工廠模式和工廠模式。簡單工廠模式即靜態工廠模式,是乙個用來例項化目標類的靜態類。工廠模式是乙個具體工廠對應乙個具體目標物件。

二、工廠模式框圖

我們通過買包子這個例子來講述下工廠模式在其中的應用,並比較下靜態工廠和工廠模式。

先來看下靜態工廠模式:

圖1. 靜態工廠模式框圖

現在看下工廠模式:

圖2. 工廠模式框圖

三、工廠模式的具體**

3.1 bun介面,包子抽象類,內部有乙個stuffing方法,顯示是什麼餡

package designpatterns.factory;

/** * created by olive on 2017/12/18.

* 包子的介面

*/public inte***ce bun

3.2 bunfactory介面,抽象包子工廠類,有乙個getbun方法,返回乙個包子例項

package designpatterns.factory;

/** * created by olive on 2017/12/18.

* 抽象包子工廠介面

*/public inte***ce bunfactory

3.3 beefbun類,牛肉餡的包子,實現了bun介面

package designpatterns.factory;

/** * created by olive on 2017/12/18.

*/public class beefbun implements bun

}

3.4 porkbun類,大肉餡(不清真 = =)的包子,實現了bun介面

package designpatterns.factory;

/** * created by olive on 2017/12/18.

* 豬肉包子類(emmmm,一點都不清真)

*/public class porkbun implements bun

}

3.5 beefbunfactory類,牛肉包子工廠,只做牛肉包子,實現了bunfactory介面

package designpatterns.factory;

/** * created by olive on 2017/12/18.

*/public class beefbunfactory implements bunfactory

}

3.6 porkbunfactory類,豬肉包子工廠,只做豬肉包子,實現了bunfactory介面

package designpatterns.factory;

/** * created by olive on 2017/12/18.

*/public class porkbunfactory implements bunfactory

}

3.7 bunsstaticfactory,靜態包子工廠,什麼包子都做

package designpatterns.factory;

/** * created by olive on 2017/12/18.

* 靜態包子工廠

*/public class bunsstaticfactory

public static bun getbeefbun()

}

3.8 client,客戶端

package designpatterns.factory;

/** * created by olive on 2017/12/18.

* 客戶,來買包子

*/public class client

}

3.8 結果

pork bun!

beef bun!

*******************

pork bun!

beef bun!

process finished with exit code 0

四、一點小總結靜態工廠模式通過在工廠中建立靜態方法來獲得目標物件例項,但是靜態工廠模式是不完全滿足「開放關閉原則」的,例子中如果要增加乙個「豆沙包」類,則需要在靜態工廠類中增加「獲取豆沙包」的方法。而工廠模式是完全滿足「開放關閉原則」的,靜態工廠模式只有乙個工廠類,而工廠模式有一組實現了相同介面的工廠類

從上述的類圖中可以看到,在結構上來說,靜態工廠模式更加簡單,工廠模式的工廠類會隨著產品種類的增多而增多,這會使系統中有很多個工廠類,使結構更加複雜。而在設計模式的角度來看,工廠模式具有相當好的擴充套件性。這兩種模式各有千秋,需要根據實際情況來選用。

設計模式 工廠模式 抽象工廠模式

建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...

設計模式 工廠設計模式

用於建立物件的介面,交給子類去實現 我們舉乙個生產nokia的例子 public abstract class nokiaphone先試定義了乙個抽象類,抽象出方法poweronphone 模擬手機開機的動作 public class nokia5200 extends nokiaphone pub...

設計模式 工廠設計模式

工廠模式分為工廠方法模式和抽象工廠模式 工廠方法模式分為 普通工廠模式,就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。靜態工廠...