재사용 가능한 객체들을 모아놓은 객체 풀 클래스를 정의한다.
여기에 들어가는 객체는 현재 자신이 ‘사용 중’ 인지 여부를 알 수 있는 방법을 제공해야 한다.
- 풀은 초기화될 때 사용할 객체들을 미리 생성하고 (보통 같은 종류의 객체를 연속된 배열에 넣는다), 이들 객체를 ‘사용 안함’ 상태로 초기화 한다.
- 새로운 객체가 필요하면 풀에 요청한다.
- 풀은 사용 가능한 객체를 찾아 ‘사용 중’ 으로 초기화한 뒤 반환한다.
- 객체를 더 이상 사용하지 않는다면 ‘사용 안 함’ 상태로 되돌린다
이런 식으로 메모리나 다른 자원 할당을 신경 쓰지 않고 마음껏 객체를 생성, 삭제할 수 있다.
언제 쓸 것인가?
- 객체를 빈번하게 생성/삭제해야 한다.
- 객체들의 크기가 비슷하다.
- 객체를 힙에 생성하기가 느리거나 메모리 단편화가 우려된다.
- 데이터베이스 연결이나 네트워크 연결같이 접근 비용이 비싸면서 재사용 가능한 자원을 객체가 캡슐화하고 있다.
객체 풀 패턴은 경량 패턴과 비슷한 점이 있다. 둘 다 재사용 가능한 객체 집합을 관리한다. 차이점은 ‘재사용’의 의미에 있다.
- 경량 패턴은 같은 인스턴스를 여러 객체에서 공유함으로써 재사용한다. 같은 객체를 동시에 여러 문맥에서 사용함으로써 메모리 중복 사용을 피하는 게 의도다.
- 객체 풀 패턴에서도 객체를 재사용하지만 여러 곳에서 동시에 재사용하진 않는다. 객체 풀에서의 ‘재사용’이란 이전 사용자가 다 쓴 다음에 객체 메모리를 회수해 가는 것을 의미한다. 이때 객체는 한 번에 한 곳에서만 사용된다.
코드링크