3 回答

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
來(lái)自Gamma,Helm,Johnson和Vlissides的“ 設(shè)計(jì)模式:可重復(fù)使用的面向?qū)ο筌浖脑亍钡?/a>第108頁(yè)。
使用Factory Method模式時(shí)
類(lèi)無(wú)法預(yù)測(cè)它必須創(chuàng)建的對(duì)象類(lèi)
一個(gè)類(lèi)希望它的子類(lèi)指定它創(chuàng)建的對(duì)象
類(lèi)將責(zé)任委托給幾個(gè)輔助子類(lèi)之一,并且您希望本地化哪個(gè)輔助子類(lèi)是委托的知識(shí)

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
除了“有效的java”(在另一個(gè)答案中提到),另一本經(jīng)典書(shū)也暗示:
首選靜態(tài)工廠方法(使用描述參數(shù)的名稱)來(lái)重載構(gòu)造函數(shù)。
例如。不要寫(xiě)
Complex complex = new Complex(23.0);
而是寫(xiě)
Complex complex = Complex.fromRealNumber(23.0);
本書(shū)甚至建議將Complex(float)
構(gòu)造函數(shù)設(shè)為私有,以強(qiáng)制用戶調(diào)用靜態(tài)工廠方法。

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