MiksIr, мне кажется, тебе мешает то, что ты привык к Yii-подобному AR, где findOne() и findAll() - методы "как бы" одной и той же штуки (хотя на самом деле внутри на уровне фреймворка многое происходит).
Я об ином подходе. Есть User extends ItemEntity, есть UserCollection extends EntitiesCollection<User> (дженерик эмулируем статическим методом getItemClass). Item умеет себя загрузить и сохранить через датасорс, Collection умеет делать запросы к датасорсу на много итемов и создавать их коллекцию. Да, получается связанная пара, но не вижу в этом ничего плохого: Collection это такая загружалка-и-фабрика, но Item можно использовать и отдельно (так же как объект можно создать фабрикой, а можно просто так).
Насчет паттернов не знаю, может и есть такие, я это сам придумал еще давно, вполне удобно.
И, кстати, Collection теоретически может быть один на все - new Collection(User::class), а все необходимое для его работы определять декларативно статически в User (AR-style). Но тут легко погрязнуть в расширении деклараций для хитрых частных случаев. Можно и комбинировать, конечно - где не хватает стандартного Collection, там экстендим.