每个模拟实例报告的一个实例:使用单例?

时间:2012-01-13 08:56:22

标签: java singleton

我编写的代码运行了许多不同的模拟,每个模拟都在自己的Simulation对象中。要从Simulation中提取结果,我们首先要求Simulation创建Report的实例(作为Simulation个孩子之一)。

即使Simulation可以包含多个实例Report,创建过程也非常昂贵,所以如果特定Report中已经存在Simulation,我想要重新使用它而不是创建一个新的。

我的代码中的许多不同类都可以访问Report个实例。我想避免复制首先检查特定Report中是否已存在Simulation的代码,然后根据该代码获取现有代码或创建新代码。

我真的只希望每个Report有一个Simulation个实例 - 有点像单身......

我看到两个途径:

  1. 创建一种“单例”报表类,允许每Report个创建不超过SimulationSpecialSimulation。这可能吗?

  2. 制作一个Simulation类扩展SpecialSimulationReport包含一个包含Simulation的单例。这有点过头了吗?

  3. Report和{{1}}来自我们拥有许可证的商业Java API;我无法修改他们的源代码。

    尽我所能学习Java和OOP的绳索......

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你真的只想做这样的事情:

public class ReportManager {
    final static ConcurrentMap<Simulation, Report> reports = new ConcurrentHashMap<Simulation, Report>();

    public static Report getReportForSimulation(final Simulation simulation){
        if (!reports.containsKey(simulation)) reports.putIfAbsent(simulation, simulation.getReport());
        return reports.get(simulation);
    }
}

然后使用ReportManager检索报告。从积极的方面来看,它非常简单,但从消极方面来看,理论上可能会导致报告在多线程环境中多次生成,但这种情况很少发生,并且您可以保证在至少所有线程都看到完全相同的报告