单例操作与多实例操作

时间:2013-05-08 16:55:32

标签: java singleton action

我有一个关于如何在Swing中实现Actions的人。

我的想法是为我的应用程序的每个动作创建一个类,扩展AbstractAction,这样我就可以在许多必须具有相同行为的组件中使用。所以我最终有一些东西:

public class ActionExample extends AbstractAction {

    @Override
    public void actionPerformed(ActionEvent arg0) {

        System.out.println("Do something");

    }

}

好吧,现在当我想要使用它时,我脑子里有三个选择:

public void makeUI1() {

    JButton btn = new JButton(new ActionExample("Do it"));

    JMenuItem mi = new JMenuItem(new ActionExample("Do it"));

}

public void makeUI2() {
    Action a = new ActionExample("Do it");
    JButton btn = new JButton(a);
    JMenuItem mi = new JMenuItem(a);
}

或者将其用作单身人士(也改变ActionExample):

public void makeUI2() {

    JButton btn = new JButton(ActionExample.getInstance());
    JMenuItem mi = new JMenuItem(ActionExample.getInstance());
}

public class ActionExample extends AbstractAction {

    private static final ActionExample INSTANCE = new ActionExample("Do it");

    public static Action getInstance() {
        return INSTANCE;
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {

        System.out.println("Do something");

    }

}

我的第一个意见是通过单例实例,但我在oracle教程中看到它在将其设置为组件之前创建了一个新实例,而且我也看到很多代码为每个组件创建新实例,所以我不知道什么是更好的,为什么。

首选一种方法用于另一种方法吗?

2 个答案:

答案 0 :(得分:1)

多实例操作允许您在操作时刻保存数据以供进一步使用。

想象一下,您想要添加撤消/重做功能。您需要保存为每个操作执行的操作。

Singleton在这种情况下没有任何优势。

答案 1 :(得分:0)

我认为最好的办法是使用MVC模式。您的AbstractAction类是一个控制器。它负责提取模型所需的信息(即:业务逻辑)以供使用。模型/业务逻辑是您重用的部分,但即使控制器使用相同的业务逻辑,控制器也可能有很大差异。

例如,您可能需要添加KeyListener的JComponent。突然之间,你预制的AbstractAction变得毫无价值,因为它不能在这种情况下使用。但是,只要重用您在AbstractAction中使用的KeyListener中的所有业务逻辑代码,就可以正确地执行操作。