My understanding of this is that object pools are useful when we want to work with an object but we want to use one that's already been instantiated. It's like a library book - you check out a book and you return it when you're finished reading it.
However, I struggle to see how this design pattern is used in real life. As a programmer, I have never seen a situation wherein I'd need to check out an object as opposed to creating a new one, passing it in as an argument, or defining a singleton variable containing the object.