java - 如何在没有单例模式的情况下强制构造函数只调用一次?

标签 java design-patterns singleton

我一直读到单例模式是一种反模式等等。但我花了将近一天的时间才发现,一个类在构造中有类似循环依赖的东西,导致多个对象,而应用程序只允许一个对象.这就是为什么我想验证这种情况再也不会发生,并且不知道如果没有单例模式该怎么做。

public class Application {
    private SingletonModule module;

    public void getModule() {
        if(module == null) {
            module = new SingletonModule(getDependency());
        }
        return module;
    }

    private Dependency getDependency() {
        return new Dependency(getModule());
    }


}

public class Dependency {
    public Dependency(SingletonModule module) {
        System.out.println(module.getAttribute()); // is more complex of course...
    }
}

public class SingletonModule {
    public Dependency dep;
    public String attribute;

    public SingletonModule(Dependency dep) {
        this.dep=dep;
    }

    public String getAttribute() {
        return attribute;
    }

}

没有问题是 getModule() 是从外部调用的,即

public class Runner {
     public Runner() {
         Application app = new Application();
         app.getModule().getAttribute();
     }
}

最佳答案

构造函数可以检查:

public class OnlyOne {
    static count = 0;
    public OnlyOne() {
        if (count > 0) throw ...
        count++;
        ...
    }
}

或工厂方法:

public class OnlyOne {
    static count = 0;
    public static OnlyOne make() {
        if (count > 0) throw ...
        count++;
        return new OnlyOne();
    }
    private OnlyOne() { ...}
}

更新: 理想情况下,此类的创建应该非常简单,例如,当程序启动然后作为依赖项传递时,不需要进行此检查。但是,如果创建发生在更复杂的情况下,就像我假设你的那样,那么这是一个有用的安全检查。

关于java - 如何在没有单例模式的情况下强制构造函数只调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22968443/

相关文章:

java - 可以在其他程序上打开的文件的 ZipException

java - JTable 单元格中的 CSS 样式

java - 在 Java 中使用 Singleton 的最佳方式

objective-c - 单例获取核心数据,在 [fetchedResultsController performFetch :&error] 上崩溃

python - 在 Python 中创建单例

java - 在java数组列表中搜索而不返回值

java - 在 CQ5 Archtype 中使用 JspC 时,在 Maven 项目中找不到 global.jsp?

ios - 开发 Swift iOS 应用程序 "The Right Way"

design-patterns - 什么时候适合为对象创建装饰器,什么时候适合重写对象以允许应用策略?

java - 报告生成器——我需要一些智能设计模式;)