1

我目前正在做一个需要重构的项目(它不是我写的,原始开发人员不在身边)。我在该应用程序中看到相当多的类只有私有构造函数和一个或多个静态方法(当前类对象的 getter/setter)。它们也有非静态方法。我举一个例子:

UndoManager 类管理应用程序执行撤消/重做的操作。它只有私有构造函数。加载应用程序时,会调用 UndoManager.setManager()。此方法从文件加载撤消历史记录或使用私有构造函数构造一个新的历史记录。

之后,每个类都可以使用同步的静态方法 .getManager() 访问 UndoManager 的这个实例。

在代码中:

public class UndoManager extends SimpleObservable<UndoManager> {

    private static UndoManager instance;
    private final Stack<Action> undoHistory;
    private final Stack<Action> redoHistory;    

    public synchronized static void setManager(UndoManager undoManager) {
        UndoManager instance = getManager();
        instance.clear();
        instance.undoHistory.addAll(undoManager.undoHistory);
        instance.redoHistory.addAll(undoManager.redoHistory);
        instance.notifyObservers(instance);
    }

    public synchronized static UndoManager getManager() {
        if (instance == null)
            instance = new UndoManager();
        return instance;
    }

    private UndoManager() {
        this.undoHistory = new Stack<Action>();
        this.redoHistory = new Stack<Action>();
    }
    /.../
}

在这个应用程序中,多个类是这样使用的。它们不是辅助类,而是应该只有一个实例的类。

我的问题是:这种访问方式是否良好?如果不是,您将如何重构该类及其访问权限?

如果它是重复的,我很抱歉,但我已经在 stackoverflow 和谷歌搜索了一段时间,但不知何故我没有找到令人满意的答案。感谢您的任何帮助。

4

2 回答 2

2

这看起来像一个单例模式。它是您可能知道的设计模式大家族的一部分。

这样做的目的是确保在整个应用程序中只使用该对象的一个​​实例。实际上,当您调用getManager()它时,它会第一次返回一个新实例,下一次它将返回以前创建的实例。

于 2013-08-19T08:01:41.367 回答
1

这是一种称为Singleton的设计模式。这是一个延迟加载,例如用于管理器类和服务类。它们适用于您想要一个实例但只有一个实例的类。

通常有一种方法可以像您的getManager方法和私有构造函数一样获取实例

于 2013-08-19T08:02:54.320 回答