구현 뿐만 아니라 추상화된 부분까지 변경시켜야 하는 경우
객체를 여러 단계로 나눠서 만들 수 있도록 각 단계를 캡슐화하고 싶다면
한 요청을 두 개 이상의 객체에서 처리하고 싶다면
어떤 클래스의 인스턴스 한 개만 가지고 여러 개의 “가상 인스턴스”를 제공하고 싶다면
어떤 언어에 대한 인터프리터를 만들 때
서로 관련된 객체 사이의 복잡한 통신과 제어를 한 곳으로 집중시키고자 하는 경우
객체를 이전 상태로 복구시켜야 하는 경우.
예를 들어 사용자가 “작업 취소”를 요청하는 경우
어떤 클래스의 인스턴스를 만드는 것이 자원/시간을 많이 잡아먹거나 복잡한 경우
다양한 객체에 새로운 기능을 추가해야 하는데 캡슐화가 별로 중요하지 않은 경우