We have been trying to explore the enterprise pattern, having it implemented in our experiments.
We totally understand the benefits of having Service layer - Code reusability, easy maintenance.
However, while understanding the Selector layer I couldn't see why having this layer will be an added advantage. Referring to this book, we always end up creating a new instance for every new query we will be needing. So if mistakenly, I don't reuse the instance that was previously created for the same requirement and create a new instance to perform the query again, I would end up doing an additional SOQL query anyway.
Am I missing any important concept here of Selector layer - Can Selector layer (or, together with Service Layer) return us the exact same set of result that was previously already queried without performing another SOQL query again? Maybe, something similar to caching - i.e. if the same set of data is again requested and if it is already queried, then return it from the 'cache' (maybe data stored in static maps, list etc). Or, does this layer is just for serving the purpose of separation of concern - Making code more readable and presentable?
Also, how feasible/ideal it is to have our own lite version of this pattern? We can see that fflib might get little complicated to understand, implement and put in to practice - So is it okay to have our own Service layer and Selector layer (maybe a little less complicated query factory which can be utilized by Service layer)? Has anyone ever tried it out?