2016-04-14 15 views
0

Tekil benzeri bir sınıfı uygulamaya koymayı deniyorum. Programın başlangıcından itibaren her 5 saniyelik periyotta oluşturulan örnekler, normal bir tekilde olduğu gibi aynı olmalıdır ve farklı 5 saniyelik açıklıklar arasında farklı tekil örnekleri olmalıdır. Buraya geldiğim şey, normal statik örnek alanı yerine, tekil örneklerini depolayan bir listedir. Ancak hala test ettiğimde aynı örneği alıyorum. İşte kod:Zaman tabanlı yaşam süresi olan Singleton

class Program 
    { 
     static void Main(string[] args) 
     { 
      TimedSingleton t1 = TimedSingleton.Instance(); 
      Thread.Sleep(5500); 
      TimedSingleton t2 = TimedSingleton.Instance(); 

     Console.WriteLine(t1 == t2); 

     Console.ReadKey(); 
    } 
} 

class TimedSingleton 
{ 
    private static ArrayList _instancesArrayList = new ArrayList(); 
    private static List<int> AddedPositions = new List<int>(); 

    private static DateTime _startTime = DateTime.Now; 

    protected TimedSingleton() 
    { 
    } 

    public static TimedSingleton Instance() 
    { 
     int index = (int) DateTime.Now.Subtract(_startTime).TotalSeconds%5; 

     if (AddedPositions.Count == 0) 
     { 
      _instancesArrayList.Add(new TimedSingleton()); 
      AddedPositions.Add(index); 
      return (TimedSingleton)_instancesArrayList[index]; 
     } 

     if (AddedPositions.Contains(index)) 
     { 
      return (TimedSingleton) _instancesArrayList[index]; 
     } 

     AddedPositions.Add(index); 
     _instancesArrayList.Add(new TimedSingleton()); 
     return (TimedSingleton) _instancesArrayList[index]; 
    } 
} 

Sonuç: true

nasıl her 5 saniyelik zaman için ayrı örnekleri dönmek için düzeltebilirim ?

cevap

1

Liste ve arraylist dizinleri ile uğraşmak yerine, yerine genel bir Dictionary<tkey, tvalue> kullanmak için değiştirdim, böylece dizin basit bir arama olabilir. Bu öğeyi eklemeye devam edeceğini unutmayın, eğer yeterince sık denirse, hafızanız biter. Burada temizlik yok.

class TimedSingleton 
{ 
    // have a dictonary to hold the seconds 
    // and the instance so we can lookup 
    private static Dictionary<int, TimedSingleton> AddedPositions = new Dictionary<int, TimedSingleton>(); 

    private static DateTime _startTime = DateTime.Now; 

    protected TimedSingleton() 
    { 
    } 

    public static TimedSingleton Instance() 
    { 
     // divide by 5 
     int index = (int)DateTime.Now.Subtract(_startTime).TotalSeconds/5; 
     Debug.WriteLine(index); 

     // 
     TimedSingleton result; 
     // if you're going to multhreed this 
     lock(AddedPositions) 
     { 
      // try to get the index seconds ... 
      if (!AddedPositions.TryGetValue(index,out result)) 
      { 
       // not happened 
       Debug.WriteLine("Created new instance"); 
       result = new TimedSingleton(); 
       // store it for later 
       AddedPositions.Add(index, result); 
      } 
      else 
      { 
       // result has now a previous instance 
       Debug.WriteLine("from cache"); 
      } 
     } 
     return result; 
    } 
} 
+0

Bu harika, çok teşekkürler. Aslında sonunda Sözlük'ü kullanarak bitirdim, ama 5'in yerine bölümün yerine geçen bölüm benim için onu mahvediyordu ve nedenini bulamadım, bunun için teşekkürler. – Marcin

İlgili konular