2012-02-08 4 views
0

Мне нужно хранить три разных типа объектов в пуле объектов и их нужно извлекать в зависимости от необходимости.Как получить различные объекты из пула?

Я попытался реализовать его с помощью Queue, но я смог сделать это только с одним типом.

Можно ли хранить и извлекать разные типы объектов в пуле объектов? Как?

+1

И каков ваш вопрос? – Blorgbeard

+0

где вопрос? – user492238

+0

У вас могут быть разные типы с общим интерфейсом и использование очереди этого типа интерфейса. – Filburt

ответ

1

Существует различие между System.Collections.Queue и System.Collections.Generic.Queue. Я думаю, вы ссылаетесь на последнее. Первый слабо типизирован, последний строго типизирован (т. Е. Вам нужно указать тип).

Недостаток использования объектов - это производительность, потому что вы должны вставлять/распаковывать каждый раз, когда вы получаете объект для проверки (т. Е. Вы его бросаете), и вам всегда нужно иметь какой-то оператор bi switch, чтобы решить, какой тип этот объект есть. Вы можете обойти это, используя дополнительные структуры данных для хранения типизированной информации об объекте.

2

Рассмотрите возможность использования общей реализации пула. Используйте отличный бассейн для каждого типа объекта, необходимого для аккумулироваться:

private static Stack<T1> poolT1 = new Stack<T1>(); 
... 
T1 myobject = poolT1.Pop(); 

Я лично предложил бы предпочесть стек поверх очередь, так как он возвращает недавно используемые объекты, которые потенциально улучшает расположение памяти - и, следовательно, причина повышения производительности кэша.

2

Queue<T> не является хорошей идеей для пула объектов, поскольку вы часто получаете доступ к данным с помощью ключа или чего-то еще. Поэтому ConcurrentDictionary<string, object> предназначен для этого случая в многопоточном приложении. Вы можете обернуть его, чтобы очистить код:

public class Pool 
{ 
    private ConcurrentDictionary<string, object> m_data = new ConcurrentDictionary<string, object>(); 

    public T Take<T>(string key) 
    { 
     //fetch data from the dictionary and convert it to the type you want 
    } 

    //other methods like Insert... 
} 
0

У вас может быть стек для каждого типа объектов, которые вы хотите объединить. В вашем случае это будет 3 стека. Затем в вашем методе Get get get, у вас будет логика, чтобы определить, какой пул следует использовать для получения соответствующего объекта. Я делаю это, передавая параметр методу Get, но это зависит от конкретной реализации.

public IType Get(int type) 
{ 
    switch (type) 
    { 
     case 1: 
      if (pool1.Count == 0) 
      { 
       return new MyObject1(); 
      } 
      else 
      { 
       return pool1.Pop(); 
      } 
      break; 
     case 2: 
      if (pool2.Count == 0) 
      { 
       return new MyObject2(); 
      } 
      else 
      { 
       return pool2.Pop(); 
      } 
      break; 
     case 3: 
      if (pool3.Count == 0) 
      { 
       return new MyObject3(); 
      } 
      else 
      { 
       return pool3.Pop(); 
      } 
      break; 
    } 
} 

В свободном методе, вы можете иметь If ... Else, как это:

public void Free(IType obj) 
{ 
    if (obj is MyObject1) 
    { 
     if (pool1.Count < MAX_POOL_SIZE) 
      pool1.Push(obj); 
    } 
    else if (obj is MyObject2) 
    { 
     if (pool2.Count < MAX_POOL_SIZE) 
      pool2.Push(obj); 
    } 
    else if (obj is MyObject2) 
    { 
     if (pool3.Count < MAX_POOL_SIZE) 
      pool3.Push(obj); 
    } 
} 

В идеале, у вас есть контроль над классом объектов, объединил. В этом случае вы добавляете к ним свойства, которые явно указывали бы их истинный тип, а затем в вашем методе Free вы использовали бы свою логику для этого свойства вместо того, чтобы использовать отражение. Это даст вам лучшую производительность.

Смежные вопросы