簡體   English   中英

我可以使用哪種設計模式來提供幾種創建“預配置” UI組件的方法

[英]Which design pattern can I use to supply several methods that create “pre-configured” UI components

免責聲明:我是Java編程的新手,並且通常都在使用“極限” OOP,因此答案可能非常簡單。


我正在Vaadin (一個Web應用程序框架)中創建一個用戶界面,該框架為我提供了許多有用的組件。 通常,我對這些組件的默認設置並不完全滿意。

例如,如果我希望每個TextField組件在字段失去焦點時立即觸發值更改事件。 我想在這些類的每個實例上設置UploadFieldTextAreaComboBox等類似的設置。

目前,我所看到的是這樣的:

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類消失了。
    • 所有邏輯都在單獨的文件中。

    缺點

    • 創建配置的組件沒有單一的界面; 將它們保持在一起的唯一原因是它們位於同一目錄中。 基本上,我必須公開很多微型類,並且沒有單個類或對象來管理它們。 (從直覺上來說,這是一件很糟糕的事情,但我不知道它是否真的 。)
    • 也沒有辦法覆蓋或擴展靜態方法,因此用於測試的“偽造” UI內容變得更加困難。
  • 抽象工廠模式我將ConfiguredComponents變成一個管理大量小型工廠的AbstractComponentFactory

    優點

    • 所有邏輯都在單獨的文件中。
    • 實際配置組件的邏輯完全是在幕后。

    缺點

    • 每當我想在視圖的代碼中的任何位置創建組件時,都需要一個AbstractComponentFactory實例。 這意味着要么保留一個缺點很多的單例對象,要么每次都創建一個new AbstractComponentFactory()

    • 如果要在我的小“庫”中添加新組件,我必須在兩三個地方而不是一個地方編寫新代碼。

  • 我不知道的其他一些設計模式:我已經閱讀了一些有關BuilderFacade的內容 ,感覺它們可能會在這里應用,但是我不太了解它們。

您將如何處理這個設計決定?

如果您的組件可以被繼承,請繼續;否則,請繼續。 對於要更改默認設置的每個組件,在構造函數中創建一個新的派生類和配置設置。 除此以外,

抽象工廠模式是一個不錯的選擇。 我認為您對此模式有誤解。 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 LocatorRegistry模式一起使用

由於您有許多對象沒有復雜的實例化過程(如果采用了構建模式),因此可以使用Abstract Factory創建對象並將其注冊到注冊表中。 無論您身在何處,都可以根據需要解決它們。

或者您可以使用簡單的IOC容器,將整個應用程序包裝在其中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM