Motivation
객체 생성은 cost 있는 작업인 경우가 많다. 프로토 타입 패턴을 통해 객체를 복사하는 것으로 생성 비용을 줄일 수 있다. Object Pool 패턴은 값비싼 객체를 재활용하는 방법을 제안한다.

Intent
비싼 객체를 재활용하자!
Implementation

Reusable
- 한정된 시간, 양 만큼 클라이언트에게 재공되는 자원
Client
- 자원을 사용함
ReusablePool
- 자원의 생성 및 관리. 싱글톤임
클라이언트가 풀에 자원을 요청하면 아래와 같은 일이 일어남
1. 이용가능한 자원확인 → 있으면 줌 2. 없으면 생성할 수 있는지 확인 → 생성되면 줌 3. 생성도 안됨 → 이용가능한 자원이 생길때 까지 대기
클라이언트는 자원을 다 사용하면 풀에 Release할 책임도 가짐
이때 Release는 Object의 참조를 다끊어 버린다는 것(Destroyed)이 아니라 Pool으로의 Release임
When to user it?
여러 클라이언트가 값비싸고 한정된 자원을 이용하려고 할때 사용함
Applicablity
DB 커넥션은 값비싼 자원임. 커넥션풀을 이용하면 DB 커넥션을 열고 닫는 행위를 최소화 하면서 열려있는 커넥션의 개수에 대한 효율적인 관리가 가능함

Specific problems
Singleton Reusable pool
- Limited number of resources in the pool
- Handling situations when creating a new resource fails
- 풀은 자원을 제공할 수 없는 경우 어떠한 방식으로든 사용자에게 알려주어야함
- Syncronization
- 위 UML ConnectionPool의 세가지 메서드는 모두 동기화를 제공해야함
- Expired resources (unused but still reserved)
- Client가 똑바로 자원을 release하지 않을 경우를 대비해서 Pool이 직접 생성한 자원들의 마지막 사용 시점을 확인하고 자원을 회수할 수도 있음