免责声明:我是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实例。这意味着要么保留一个has a lot of downsides对象,要么每次创建一个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()方法中创建一个实例,然后尝试将此实例注入到需要创建组件的每个位置。

关于java - 我可以使用哪种设计模式来提供几种创建“预配置” UI组件的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31314210/

10-14 11:11
查看更多