構造函數與工廠方法建模類時,首選的首選方法是什么:構造者,或工廠方法使用其中任何一個會有什么考慮因素?在某些情況下,我更喜歡有一個工廠方法,如果無法構造對象,則返回null。這使代碼整潔。在執行替代操作之前,我可以簡單地檢查返回的值是否為null,與從構造函數中拋出異常相反。(我個人不喜歡例外)比如說,我在類上有一個構造函數,它需要一個id值。構造函數使用此值從數據庫填充類。如果不存在具有指定標識的記錄,則構造函數將拋出RecordNotFoundException。在這種情況下,我將不得不在try..catch塊中包含所有這些類的構造。與此相反,我可以在這些類上有一個靜態工廠方法,如果找不到記錄,它將返回null。在這種情況下,哪種方法更好,構造函數或工廠方法?
3 回答

largeQ
TA貢獻2039條經驗 獲得超8個贊
來自Gamma,Helm,Johnson和Vlissides的“ 設計模式:可重復使用的面向對象軟件的元素”的第108頁。
使用Factory Method模式時
類無法預測它必須創建的對象類
一個類希望它的子類指定它創建的對象
類將責任委托給幾個輔助子類之一,并且您希望本地化哪個輔助子類是委托的知識

弒天下
TA貢獻1818條經驗 獲得超8個贊
有時您必須在創建對象時檢查/計算某些值/條件。如果它可以拋出異常 - constructro是非常糟糕的方式。所以你需要做這樣的事情:
var value = new Instance(1, 2).init()public function init() { try { doSome() } catch (e) { soAnotherSome() }}
所有其他計算都在init()中。但只有你作為開發人員真正了解這個init()。當然,幾個月之后你就會忘記它。但是如果你有一個工廠 - 只需要在一個方法中完成所有你需要的東西,直接調用隱藏這個init() - 所以沒有問題。使用這種方法不會導致創建和內存泄漏。
有人告訴你有關緩存的信息。很好。但是你還必須記住Flyweight模式,它很適合與Factory方式一起使用。
添加回答
舉報
0/150
提交
取消