gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:20:22 25 4
gpt4 key购买 nike

免责声明:我是 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来管理很多较小的工厂。

    优点:

    • 所有逻辑都位于单独的文件中。
    • 实际配置组件的逻辑完全在幕后进行。

    缺点:

    • 每次我想在代码中的任何位置为 View 创建组件时,我都需要一个 AbstractComponentFactory 实例。这意味着要么保留一个单例对象,has a lot of downsides ,或者每次都创建一个new AbstractComponentFactory()

    • 如果我想向我的小“库”添加新组件,我必须在两到三个地方编写新代码,而不仅仅是一个地方。

  • 一些我不知道的其他设计模式:我读过一些关于BuilderFacade的内容,感觉它们可能适用于此,但我不太理解它们。

您将如何做出这个设计决策?

最佳答案

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

抽象工厂模式是一个不错的选择。我认为您对这种模式有误解。 AbstractComponentFactory 只是一个接口(interface),它不管理任何东西。该界面如下所示:

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() 方法中只创建一个实例,然后尝试将该实例注入(inject)到每个需要创建组件的地方。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com