3 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
看來,OP的(優(yōu)秀)問題列表已被忽略。當(dāng)前的答案僅提供了經(jīng)過重新定義的定義。因此,我將嘗試簡潔地解決原始問題。
如果抽象工廠只有一個(gè)創(chuàng)建者和一個(gè)產(chǎn)品,那么它仍然是抽象工廠模式嗎?(用于創(chuàng)建家族的界面)
沒有。抽象工廠必須創(chuàng)建多個(gè)產(chǎn)品才能制作“相關(guān)產(chǎn)品系列”。規(guī)范的GoF示例創(chuàng)建ScrollBar()和Window()。優(yōu)點(diǎn)(和目的)是,抽象工廠可以在其多個(gè)產(chǎn)品中強(qiáng)制使用一個(gè)公共主題。
可以從接口創(chuàng)建Factory Method具體創(chuàng)建器,還是必須從類創(chuàng)建它?(類將實(shí)例化延遲到子類)
首先,我們必須注意,GoF編寫本書時(shí)既沒有Java也沒有C#。術(shù)語接口的GoF使用與特定語言引入的接口類型無關(guān)。因此,可以從任何API創(chuàng)建具體的創(chuàng)建者。模式中的重點(diǎn)是API使用了自己的Factory方法,因此只有一個(gè)方法的接口不能是Factory方法,而只能是Abstract Factory。
如果抽象工廠只能有一個(gè)創(chuàng)建者和一個(gè)產(chǎn)品,那么抽象工廠和 工廠方法之間的唯一區(qū)別是前者的創(chuàng)建者是一個(gè)接口,后者的創(chuàng)建者是一個(gè)類嗎?
按照上述答案,該問題不再有效;但是,如果您認(rèn)為抽象工廠和工廠方法之間的唯一區(qū)別是創(chuàng)建的產(chǎn)品數(shù)量,請(qǐng)考慮客戶如何使用這些模式中的每一個(gè)。通常將抽象工廠注入其客戶端,并通過組合/委托進(jìn)行調(diào)用。工廠方法必須被繼承。因此,一切都回到了舊的組合與繼承之爭。
但是這些答案提出了第四個(gè)問題!
由于只有一個(gè)方法的接口不能是工廠方法,而只能是抽象工廠,所以我們?cè)趺捶Q呼只有一個(gè)方法的創(chuàng)建接口?
如果該方法是靜態(tài)的,則通常稱為“ 靜態(tài)工廠”。如果該方法是非靜態(tài)的,則通常稱為簡單工廠。這些都不是GoF模式,但是在實(shí)踐中它們更常用!
添加回答
舉報(bào)