Пул объектов: абстрактный суперкласс или общий? - PullRequest
0 голосов
/ 06 марта 2012

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

Должен ли я создать универсальный класс для пула и интерфейс для применения к созданным объектам, или я должен создать абстрактный класс пула с общей логикой, а затем создать конкретные подклассы для всех различных классов, с которыми я хочу его использовать?

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Ну, вы можете иметь обе вещи, т.е. создать абстрактный обобщенный класс. Я бы предпочел универсальный интерфейс, реализованный универсальным классом и созданный для конкретного типа за фабричным методом / классом. Абстрактный класс заставит создавать производные классы, делая его более утомительным. Пример использования, который я имею в виду, выглядит примерно так:

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

Обратите внимание, что это все еще может оставить мне область для специализации путем наследования от универсального класса - типичной потребностью будет сложное создание экземпляра (конечно, можно смоделировать, предоставив реализацию пула с фабричным интерфейсом или фабричным делегатом)

0 голосов
/ 06 марта 2012

Это классический пример того, почему вы предпочитаете Generic Stack<T> классу на основе объекта Stack, и почему дженерики были введены для решения проблемы классов на основе объекта.Это объясняется в MSDN здесь .

Полагаю, если вы используете второй вариант, вам придется ввести new concrete class для каждого пула объектов , который вы хотитесоздать в future, который будет громоздким до , поддерживать и развивать .Итак, перейдите к первому варианту создания общего Pool<T> класса и, да, вы также можете воспользоваться преимуществами шаблона проектирования Factory с этим первым вариантом, как объяснено в другом ответе.

Фактически, естьэто примерная ObjectPool<T> реализация здесь .

0 голосов
/ 06 марта 2012

Это типичный сценарий для универсальных типов.Поэтому я выступаю за общий пул.

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

...