У вас может быть стек для каждого типа объектов, которые вы хотите объединить.В вашем случае это будет 3 стека.Тогда внутри метода 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;
}
}
В вашем методе Free вы можете использовать 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 вы бы применили логику к этому свойству вместо использования отражения.Это даст вам лучшую производительность.