我可以使用哪种设计模式来提供创建 "pre-configured" UI 组件的几种方法

Which design pattern can I use to supply several methods that create "pre-configured" UI components

免责声明:我是 Java 编程的新手,并且通常使用“极端”OOP,所以这个问题的答案可能非常简单。


我正在 Vaadin 中创建一个用户界面,这是一个为我提供许多有用组件的 Web 应用程序框架。通常,我对这些组件的默认设置并不完全满意。

例如,如果我希望每个 TextField 组件在字段失去焦点时立即触发值更改事件。 UploadFieldTextAreaComboBox 等有类似的设置,我想在 每个 实例上设置 classes .

目前,我拥有的是这样的:

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. 
}

这完全不像 class!它只是静态方法的集合,我被告知要避免。另外,我想将每个组件的逻辑放在一个单独的文件中。配置有时会非常复杂,这样更有意义:这些都是非常小的独立逻辑位。

以下是我考虑过的解决方案:

您将如何处理这个设计决策?

我认为一种可能的方法是将 AbrstractFactory 与 Service Locator or Registry patterns

一起使用

因为你有无数的对象没有复杂的实例化过程(如果是的话求助于构建模式),你用抽象工厂创建对象并将它们注册到注册表中。随时随地根据需要解决它们。

或者您可以求助于简单的 IOC 容器,您的整个应用程序都围绕着

如果你的组件可以被继承,那就继续吧;对于要更改默认设置的每个组件,在构造函数中创建一个新的派生 class 和配置设置。否则,

抽象工厂模式是个不错的选择。我认为您对这种模式有误解。 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() 方法中只创建一个实例,然后尝试将这个实例注入到每个需要创建组件的地方。