2012-01-13 141 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檢索報告。從積極的方面來看,它非常簡單,但從消極方面來看,理論上可能會在多線程環境中多次生成報告,但這種情況很少發生,並且您可以保證至少所有線程都能看到確切的同樣的報告