3 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
所有三種工廠類型都做同樣的事情:它們是“智能構(gòu)造函數(shù)”。
假設(shè)您希望能夠創(chuàng)建兩種水果:Apple和Orange。
廠
工廠是“固定的”,因?yàn)槟阒挥幸粋€(gè)沒(méi)有子類化的實(shí)現(xiàn)。在這種情況下,您將擁有這樣的類:
class FruitFactory { public Apple makeApple() { // Code for creating an Apple here. } public Orange makeOrange() { // Code for creating an orange here. }}
使用案例:構(gòu)造Apple或Orange有點(diǎn)太復(fù)雜,無(wú)法在構(gòu)造函數(shù)中處理。
工廠方法
工廠方法通常用于在類中進(jìn)行一些通用處理,但想要改變實(shí)際使用的水果類型。所以:
abstract class FruitPicker { protected abstract Fruit makeFruit(); public void pickFruit() { private final Fruit f = makeFruit(); // The fruit we will work on.. <bla bla bla> }}
...然后,您可以FruitPicker.pickFruit()
通過(guò)在子類中實(shí)現(xiàn)工廠方法來(lái)重用通用功能:
class OrangePicker extends FruitPicker { @Override protected Fruit makeFruit() { return new Orange(); }}
抽象工廠
抽象工廠通常用于依賴注入/策略之類的東西,當(dāng)你想要能夠創(chuàng)建一整套需要“同類”的對(duì)象時(shí),并且有一些共同的基類。這是一個(gè)與水果有關(guān)的模糊例子。這里的用例是我們要確保我們不會(huì)在Apple上意外使用OrangePicker。只要我們從同一家工廠獲得我們的水果和采摘器,他們就會(huì)匹配。
interface PlantFactory { Plant makePlant(); Picker makePicker(); }public class AppleFactory implements PlantFactory { Plant makePlant() { return new Apple(); } Picker makePicker() { return new ApplePicker(); }}public class OrangeFactory implements PlantFactory { Plant makePlant() { return new Orange(); } Picker makePicker() { return new OrangePicker(); }}

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
這三種模式如何相互不同?
Factory:創(chuàng)建對(duì)象而不將實(shí)例化邏輯暴露給客戶端。
工廠方法:定義用于創(chuàng)建對(duì)象的接口,但讓子類決定實(shí)例化哪個(gè)類。Factory方法允許類將實(shí)例化延遲到子類
抽象工廠:提供用于創(chuàng)建相關(guān)或從屬對(duì)象族的接口,而無(wú)需指定其具體類。
AbstractFactory模式使用組合將創(chuàng)建對(duì)象的責(zé)任委托給另一個(gè)類,而Factory方法設(shè)計(jì)模式使用繼承并依賴派生類或子類來(lái)創(chuàng)建對(duì)象
什么時(shí)候用哪個(gè)?
工廠:客戶只需要一個(gè)類,而不關(guān)心它正在實(shí)現(xiàn)哪個(gè)具體實(shí)現(xiàn)。
工廠方法:客戶端不知道在運(yùn)行時(shí)需要?jiǎng)?chuàng)建哪些具體類,但只想獲得一個(gè)可以完成工作的類。
AbstactFactory:?當(dāng)您的系統(tǒng)必須創(chuàng)建多個(gè)系列的產(chǎn)品或您想要提供產(chǎn)品庫(kù)而不暴露實(shí)現(xiàn)細(xì)節(jié)時(shí)。
抽象工廠類通常使用Factory Method實(shí)現(xiàn)。工廠方法通常在模板方法中調(diào)用。
如果可能的話,任何與這些模式相關(guān)的java示例?
工廠和工廠方法
意圖:
定義用于創(chuàng)建對(duì)象的接口,但讓子類決定實(shí)例化哪個(gè)類。Factory Method允許類將實(shí)例化延遲到子類。
UML圖:
Product:它定義Factory方法創(chuàng)建的對(duì)象的接口。
ConcreteProduct:實(shí)現(xiàn)產(chǎn)品界面
創(chuàng)建者:聲明工廠方法
ConcreateCreator:?實(shí)現(xiàn)Factory方法以返回ConcreteProduct的實(shí)例
問(wèn)題陳述:使用工廠方法創(chuàng)建游戲工廠,工廠方法定義游戲界面。
代碼段:
工廠模式。何時(shí)使用工廠方法?
與其他創(chuàng)作模式比較:
設(shè)計(jì)從使用工廠方法(不太復(fù)雜,可定制,子類增加)開(kāi)始,并逐漸向Abstract Factory,Prototype或Builder發(fā)展(更靈活,更復(fù)雜),因?yàn)樵O(shè)計(jì)師發(fā)現(xiàn)需要更多靈活性的地方
抽象工廠類通常使用工廠方法實(shí)現(xiàn),但也可以使用Prototype實(shí)現(xiàn)
添加回答
舉報(bào)