亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

構造函數與工廠方法

構造函數與工廠方法

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

3 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

來自Gamma,Helm,Johnson和Vlissides的“ 設計模式:可重復使用的面向對象軟件的元素”的第108頁

使用Factory Method模式時

  • 類無法預測它必須創建的對象類

  • 一個類希望它的子類指定它創建的對象

  • 類將責任委托給幾個輔助子類之一,并且您希望本地化哪個輔助子類是委托的知識


查看完整回答
反對 回復 2019-08-26
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

除了“有效的java”(在另一個答案中提到),另一本經典書也暗示:

首選靜態工廠方法(使用描述參數的名稱)來重載構造函數。

例如。不要寫

Complex complex = new Complex(23.0);

而是寫

Complex complex = Complex.fromRealNumber(23.0);

本書甚至建議將Complex(float)構造函數設為私有,以強制用戶調用靜態工廠方法。


查看完整回答
反對 回復 2019-08-26
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

有時您必須在創建對象時檢查/計算某些值/條件。如果它可以拋出異常 - constructro是非常糟糕的方式。所以你需要做這樣的事情:

var value = new Instance(1, 2).init()public function init() {
    try {
        doSome()
    }
    catch (e) {
        soAnotherSome()
    }}

所有其他計算都在init()中。但只有你作為開發人員真正了解這個init()。當然,幾個月之后你就會忘記它。但是如果你有一個工廠 - 只需要在一個方法中完成所有你需要的東西,直接調用隱藏這個init() - 所以沒有問題。使用這種方法不會導致創建和內存泄漏。

有人告訴你有關緩存的信息。很好。但是你還必須記住Flyweight模式,它很適合與Factory方式一起使用。


查看完整回答
反對 回復 2019-08-26
  • 3 回答
  • 0 關注
  • 731 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號