2017-05-01 38 views
2

下面,我已經實現了Multiton模式,但我認爲這個問題同樣適用於Singleton模式:辛格爾頓(或者多例)模式的基礎上經過時間

private static ConcurrentHashMap<String, LocatorDAO> instances = new ConcurrentHashMap<String, LocatorDAO>(); 

public static LocatorDAO getInstance(String page String field) 
{ 
    String instanceID = page + " " + field; 
    LocatorDAO result = instances.get(instanceID); 

    if (result == null) 
    { 

     LocatorDAO m = new LocatorDAO(page, field); 
     result = instances.putIfAbsent(instanceID, m); 

     if (result == null) 
      result = m; 
    } 

    return result; 
} 

我想通過一個實例來修改這個設計新實例每300秒 - 所以如果從我們實例化先前實例的時間過去300秒,我想再次實例化它(或者如果實例從未實例化)。

這怎麼辦?

+0

注意:您可以使用computeIfAbsent來簡化當前的代碼。例如,請參閱:http://stackoverflow.com/a/18149547/829571 – assylias

+0

不確定您的'HashMap'有多大的靈活性。它是否與你的其他代碼緊密結合?如果是這樣,你被迫在'getInstance'內使用靜態本地時間戳? – jiveturkey

回答

0

解決方案: 無論何時創建實例,都要保存時間戳。無論何時創建新實例,請檢查保存的時間戳並查找時間差。

如何實現: 至少有兩種方法可以實現這一目標:

  1. 的創建時間戳添加到instanceID,並通過所有的按鍵手動搜索。這是一個簡單的解決方案,但會更慢,因爲您必須搜索散列映射中的所有鍵。

  2. 實現一個bean類,它將有兩個字段LocatorDAO和一個長字段來保存創建時間。在創建過程中,如果在散列圖中的項目,檢查它的創建時間,如果是老年人超過300秒,創建一個新的實例

希望這個答案(無代碼示例)是不夠好。