Прежде чем вводить новый уровень абстракции, убедитесь, что выгоды перевесят затраты. В вашем случае это будет включать:
Стоимость разработки и внедрения абстракции
StaffFactory гораздо проще спроектировать, реализовать и протестировать, чем универсальный класс Factory .
Стоимость понимания Фабрики Абстракция
Каждый раз, когда кто-то читает код, ему может понадобиться обернуть голову вокруг абстракции. Обобщенную абстракцию сложнее обернуть, чем необщую.
Стоимость внесения изменений в будущем
Допустим, у вас есть Фабрика и Фабрика , и в будущем вы обнаружите, что вам нужна другая политика кэширования для этих двух. Возможно, Factory должен отказаться от кэшированного объекта, если размер кэша превышает некоторый порог.
Собираетесь ли вы обобщить класс Factory <> для поддержки различных режимов? Это можно сделать, но это намного сложнее, чем просто изменить классы StaffFactory и ProductFactory независимо друг от друга.
Краткое описание
Так что, не вводите абстракцию только ради нее. И, безусловно, не обобщайте StaffFactory в универсальный Factory , если Factory будет единственным универсальным экземпляром, который у вас будет.
Из приведенного выше кода кажется, что ваш класс Factory будет в основном словарем . Если это так, то введение дополнительного универсального класса Factory не принесет вам большой пользы, а только добавит ненужный уровень абстракции.