对象池:抽象超类还是通用?

时间:2012-03-06 08:28:04

标签: c# generics memory-management abstract-class objectpool

在我的项目中,我想对不同类型的对象使用对象池 - 行为相似但池大小不同。

我应该为池和接口创建泛型类以应用于创建的对象,还是应该创建具有公共逻辑的抽象池类,然后为我想要使用它的所有不同类创建特定的子类? / p>

3 个答案:

答案 0 :(得分:2)

你可以拥有两件事,即创建一个抽象的泛型类。我更喜欢通用类实现的通用接口,并为工厂方法/类后面的特定类型实例化。抽象类将强制创建派生类,使其更加繁琐。我想到的示例用法类似于

IPool<MyClass> = PoolFactory.Get<MyClass>(5);  // 5 being pool size
IPool<IFoo> = PoolFactory.Get<FooImpl>(5);
IPool<IBar> = PoolFactory.Get(5, () => new BarImpl("some argument")); // instance creation with factory method

请注意,通过继承泛型类,它仍然可以为我提供专业化的范围 - 典型的需求是复杂的实例创建(当然可以通过为工厂接口或工厂委托提供池实现来建模)

答案 1 :(得分:0)

这是通用类型的典型方案。所以我提倡通用池。

泛型只在其他类使用对它的引用而不知道具体类型的情况下才会产生问题。在这种情况下,您可以创建由通用池类实现的非泛型接口。

答案 2 :(得分:0)

这是一个典型的例子,说明为什么你应该更喜欢Generic Stack<T>而不是基于对象的Stack类,以及为什么引入泛型来解决基于对象的类问题。 MSDN here中解释了这一点。

我想如果您使用第二个选项,那么您必须为 new concrete class中要创建的每个对象池引入一个future 繁琐 维护和开发。因此,请选择创建Generic Pool<T>类的第一个选项,是的,您还可以使用第一个选项获得Factory设计模式的好处,如另一个答案中所述。

事实上,有一个示例通用ObjectPool<T>实施here