[英]Which design pattern can I use to supply several methods that create “pre-configured” UI components
免責聲明:我是Java編程的新手,並且通常都在使用“極限” OOP,因此答案可能非常簡單。
我正在Vaadin (一個Web應用程序框架)中創建一個用戶界面,該框架為我提供了許多有用的組件。 通常,我對這些組件的默認設置並不完全滿意。
例如,如果我希望每個TextField
組件在字段失去焦點時立即觸發值更改事件。 我想在這些類的每個實例上設置UploadField
, TextArea
, ComboBox
等類似的設置。
目前,我所看到的是這樣的:
public class ConfiguredComponents {
public static TextField createConfiguredTextField(String caption) {
TextField field = new TextField(caption);
field.setImmediate(true);
field.setSomeOtherOptions();
...
return field;
}
public static UploadField createConfiguredUploadField(...) {
...
}
// etc.
}
感覺根本不像上課 ! 它只是靜態方法的集合,有人告訴我要避免這種方法。 另外,我想將每個組件的邏輯放在單獨的文件中。 有時,配置會涉及到很多事情,從這種意義上來說更有意義:這些都是非常小的獨立的邏輯位。
這是我考慮過的解決方案:
保持簡單:我可以擺脫ConfiguredComponents
,而只制作一個包含小型工廠類的大軟件包 。 例如, myproject.ui.components.TextFieldFactory
知道如何創建配置的TextField
,僅此而已。
優點 :
ConfiguredComponents
類消失了。 缺點 :
抽象工廠模式 :我將ConfiguredComponents
變成一個管理大量小型工廠的AbstractComponentFactory
。
優點 :
缺點 :
每當我想在視圖的代碼中的任何位置創建組件時,都需要一個AbstractComponentFactory
實例。 這意味着要么保留一個缺點很多的單例對象,要么每次都創建一個new AbstractComponentFactory()
。
如果要在我的小“庫”中添加新組件,我必須在兩三個地方而不是一個地方編寫新代碼。
我不知道的其他一些設計模式:我已經閱讀了一些有關Builder和Facade的內容 ,感覺它們可能會在這里應用,但是我不太了解它們。
您將如何處理這個設計決定?
如果您的組件可以被繼承,請繼續;否則,請繼續。 對於要更改默認設置的每個組件,在構造函數中創建一個新的派生類和配置設置。 除此以外,
抽象工廠模式是一個不錯的選擇。 我認為您對此模式有誤解。 AbstractComponentFactory
只是一個接口,它不管理任何東西。 該界面如下所示:
interface AbstractComponentFactory {
public TextField createTextFiled(...);
public UploadField createUploadFiled(...);
...
}
根據您的情況,我認為您只需要為該工廠執行一個實現:
class MaurisComponentFactory implements AbstractComponentFactory {
public TextField createTextFiled(...) {
new ... config ... return;
}
public UploadField createUploadFiled(...) {
new ... config ... return;
}
...
}
如您所說,我們既不應每次使用Singleton也不應該創建新的MaurisComponentFactory
。 相反,我們應該只在main()方法中創建一個實例,然后嘗試將此實例注入到需要創建組件的每個位置。
我認為可以考慮的一種可能方法是將AbrstractFactory與Service Locator或Registry模式一起使用
由於您有許多對象沒有復雜的實例化過程(如果采用了構建模式),因此可以使用Abstract Factory創建對象並將其注冊到注冊表中。 無論您身在何處,都可以根據需要解決它們。
或者您可以使用簡單的IOC容器,將整個應用程序包裝在其中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.