在我的例子中替代Singleton?

时间:2014-05-30 16:10:56

标签: java swing user-interface singleton instance

我有一个用Java编写的应用程序。 我有一个容器类用于我的所有GUI元素MyForm,我想实现一个类,它提供了几种方法来操作Form FormOperator。例如,禁用按钮或将点写入TextPane。

现在,许多这些方法需要他们想要操作的GUI元素的实例。例如,方法writeDots(JTextPane p)

但是在下一步中,我想在实现FormOperator的类中使用类Runnable。所以我必须将JTextPane的实例传递给实现Runnable的类,然后Runnable类将它传递给FormOperator类。但在我看来,这不是一个正确的方式。

我的想法是让类Form成为Singleton,这样我就可以从runnable类中获取Form的实例。然后我可以在FormgetTextPane()中创建一个方法,以获取TextPane的实例。

但是当我读到Singletons也不应该被使用。那么在这种情况下你会建议做什么呢。

P.S:抱歉我的英语不好。 :)但我希望你得到点。

2 个答案:

答案 0 :(得分:0)

Singleton或其他模式是否合适取决于您提供给我们的更多信息。 “不是一种正确的方法”并不能解释为什么你不想将容器类传递给Runnable实例以传递给FormOperator实例。

问问自己程序中有哪些项目以及它们代表什么,以及它们的预计用途是否与您熟悉的模式相匹配。从表面上看,单身形式对我没有任何意义,但可能在特殊情况下。但是,只是避免在构造函数和方法中传递它是没有理由的。

有时候在编程中我们迷恋于我们已经拥有的一个想法,并找到一种方法使其工作,而不是查看我们试图解决的问题,并找出在代码中建模的最佳方法。要成为一名软件工程师,仅仅做一些工作是不够的,它应该是健壮的,尽可能易于维护,并且可以预测它可能需要的灵活性。

答案 1 :(得分:0)

单身人士出于多种原因并不是一个好的解决方案,主要是因为他们并不比全局变量好多少。 在你的情况下使用singleton会严重损害可重用性,因为一旦你需要同时显示同一个表单的两个实例,你将无法这样做,因为只存在Form和FormOperator类。

如果我是你,在第一步我将实例化Form然后将其作为构造函数参数传递给FormOperator:

public FormOperator(Form frm) {
    this.frm = Objects.requireNonNull(frm, "frm cannot be null");
}

稍后需要进一步的重构。应用MVC模式会很有用。值得一读:http://martinfowler.com/eaaDev/uiArchs.html