在我的项目中,我希望对不同类型的对象使用对象池-具有相似的行为,但池大小不同。
我应该为池和接口创建泛型类以应用于创建的对象,还是应该创建具有通用逻辑的抽象池类,然后为我想要使用它的所有不同类创建特定的子类?
发布于 2012-03-06 16:34:10
你可以同时做这两件事,比如创建一个抽象的泛型类。我更喜欢由泛型类实现的泛型接口,并在工厂方法/类后面为特定类型实例化。抽象类将强制创建派生类,使其更加繁琐。我脑海中的示例用法如下
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请注意,它仍然可以通过继承泛型类为我留下专门化的范围-典型的需求是一个复杂的实例创建(当然,可以通过提供具有工厂接口或工厂委托的池实现来建模)
发布于 2012-03-06 16:54:06
这是泛型类型的典型场景。所以我提倡使用泛型池。
泛型只有在其他类使用对它的引用而不知道具体类型的情况下才会产生问题。在这种情况下,您可以创建一个由泛型池类实现的非泛型接口。
发布于 2012-03-06 17:11:01
这是一个经典的例子,说明了为什么你应该更喜欢泛型Stack<T>而不是基于对象的Stack类,以及为什么引入泛型来解决基于对象的类的问题。这在MSDN here中有解释。
我认为如果您使用第二种选择,那么您将不得不为您想要在future中创建的每个对象池引入一个new concrete class,这将使维护和开发变得很麻烦。因此,使用创建泛型Pool<T>类的第一个选项,是的,您还可以使用Factory设计模式的好处,如另一个答案中所述的第一个选项。
实际上,有一个通用的ObjectPool<T>实现here示例。
https://stackoverflow.com/questions/9580189
复制相似问题