2012-01-13 139 views
1

我已经编写了运行许多不同模拟的代码,每个模拟都在它自己的Simulation对象中。为了提取Simulation的结果,我们首先必须要求Simulation创建一个Report(作为Simulation的孩子之一)的实例。模拟实例报告的一个实例:使用单例?

即使一个Simulation可以包含很多情况下Report,创建过程是相当昂贵的,所以如果有已经在那个特定Simulation一个Report,我想重新使用它,而不是创建一个新的。

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

我真的只希望这是ReportSimulation的一个实例 - 有点像一个单身......

我看到两个途径:

  1. 制定一种“单身”的报告类,允许创建不超过一个ReportSimulation。这可能吗?

  2. 制作SpecialSimulation类,它扩展Simulation,并在SpecialSimulation包括含有Report单身。这是否过分矫枉过正?

SimulationReport是从商业的Java API,我们有许可证的;我无法修改他们的源代码。

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

+2

您可以在'SpecialSimulation'的构造函数中启动'Report',不需要单个元素,然后 – fge 2012-01-13 08:59:11

+0

由于您不能修改模拟和报表,并且因为我们甚至没有他们的API文档,这很难回答。然而,用Java创建对象并不昂贵。我怀疑生成报告的成本不是创建对象,而是用合适的值填充它。每次必须在报告中设置新值时重新使用相同的实例或创建一个新实例不会改变任何内容。 – 2012-01-13 09:36:54

回答

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检索报告。从积极的方面来看,它非常简单,但从消极方面来看,理论上可能会在多线程环境中多次生成报告,但这种情况很少发生,并且您可以保证至少所有线程都能看到确切的同样的报告