单例操作与多实例操作



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

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

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教程中看到,它在将其设置为组件之前创建一个新实例,并且在我也看到许多代码为每个组件创建新实例,所以我不知道它更好,为什么。

是首选的一种方法比其他使用?

多实例操作允许您在操作时保存数据以供以后使用。

假设你想添加撤销/重做功能。您需要为每个操作保存已完成的操作。

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

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

例如,你可能有一个需要添加KeyListener的JComponent。突然之间,您预先制作的AbstractAction变得毫无价值,因为它不能在这种情况下使用。但是,只要您重用了在AbstractAction中使用的KeyListener中的所有业务逻辑代码,那么您就做对了。

最新更新