0
我正試圖從JDK學習設計模式。我試圖通過BorderFactory類瞭解Factory模式。我發現我可以創建不同的邊框,例如LineBorder無需使用工廠。那麼爲什麼如此......?如果有工廠可用,那麼爲什麼他們也打開它,也可以在不使用工廠的情況下創建LineBorder的對象。那麼創建BorderFactory的動機是什麼?爲什麼沒有強制LineBorder不是由BorderFactory創建的?
我正試圖從JDK學習設計模式。我試圖通過BorderFactory類瞭解Factory模式。我發現我可以創建不同的邊框,例如LineBorder無需使用工廠。那麼爲什麼如此......?如果有工廠可用,那麼爲什麼他們也打開它,也可以在不使用工廠的情況下創建LineBorder的對象。那麼創建BorderFactory的動機是什麼?爲什麼沒有強制LineBorder不是由BorderFactory創建的?
JRE現在已經有近二十年的歷史了,很可能(我會說到的)BorderFactory在早期版本中甚至沒有存在。雖然BorderFactory有助於避免創建大量基本相同的邊框對象,但新的XXXBorder()是創建這種邊框的唯一方法。爲了與舊代碼兼容,類和構造函數需要保持公開。
不幸的是BorderFactory在它的javadoc中沒有「since」,我懶得挖出1.0-1.2文檔來檢查什麼時候引入。 Borderfactory中的一些方法具有「自1.7以來」,所以它至少經歷了一些演變。
除非David Kloba(這個班的第一作者)在這裏作出明確的陳述,否則「難以回答」的答案很難確定。我的猜測是很少有「簡單的」邊界類('LineBorder','EmptyBorder' ...)被製作爲'public',這樣人們可以很容易地擴展這些類 - 作爲某種「存根實現」。但除此之外,確實如此,當通過工廠提供這樣的班級時,幾乎沒有深刻的理由。 – Marco13
@ Marco13,[如何使用邊框](http://docs.oracle.com/javase/tutorial/uiswing/components/border.html)教程也暗示了「創建自定義邊框」中類似的內容。 *如果BorderFactory不能提供對邊框表單的足夠控制,那麼您可能需要直接在邊框包中使用API,或者甚至定義自己的邊框。* – predi
我同意。那麼使用BorderFactory並不是動機。誰知道這個工廠將使用它,其他人將直接創建邊界。 – Amit