- 객체 지향 특성 = 도구
설계 원칙 = 도구를 올바르게 사용하는 방법
디자인 패턴 = 레시피
- 디자인 패턴은 상속, 인터페이스, 합성(객체를 속성으로 사용)을 이용한다
Adapter Pattern
호출당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 통해 호출하는 패턴
- 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것
- 개방 폐쇄 원칙을 활용한 설계 패턴
- 객체를 속성으로 만들어 참조하는 디자인 패턴
Proxy Pattern
제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴
- 프록시 = 대리자, 대변인
- 실제 서비스 객체가 가진 메서드와 같은 이름의 메서드를 사용하는데, 이를 위해 인터페이스를 사용
인터페이스를 사용하면 서비스객체가 들어갈 자리에 대리자 객체를 대신 투입해 클라이언트 쪽에서는 실제 서비스 객체를 통해 메서드를 호출하고 반환값을 받는지, 대리자 객체를 통해 메서드를 호출하고 반환값을 받는지 전혀 모르게 처리할 수 있다.
- 대리자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다
- 대리자는 실제 서비스에 대한 참조 변수를 갖는다(합성)
- 대리자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다
- 대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다
- 프록시 패턴은 제어의 흐름을 변경하거나 다른 로직을 수행하기 위해 사용
Decorator Pattern
메서드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴
- 데코레이터 = 도장/도배업자
- 프록시 패턴과 구현 방법이 같다. 다만 프록시 패턴은 클라이언트가 최종적으로 돌려 받는 반환값을 조작하지 않고 그대로 전달하는 반면 데코레이터 패턴은 클라이언트가 받는 반환값에 장식을 덧입힌다.
- 장식자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.
- 장식자는 실제 서비스에 대한 참조 변수를 갖는다(합성)
- 장식자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고, 그 반환값에 장식을 더해 클라이언트에게 돌려준다.
- 장식자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다
Singlton Pattern
클래스의 인스턴스, 즉 객체를 하나만 만들어 사용하는 패턴
- 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러 개 만들게 되면 불필요한 자원을 사용하게 되고, 또 프로그램이 예상치 못한 결과를 낳을 수 있다
- 싱글톤 패턴은 오직 인스턴스를 하나만 만들고 그것을 계속해서 재사용한다.
- new를 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다.
- 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다
- 유일한 단일 객체를 참조할 정적 참조 변수가 필요하다
- 싱글톤 패턴은 하나의 단일 객체를 참조하는데, 단일 객체인 경우 공유 객체로 사용되기 때문에 속성을 갖지 않게 하는 것이 정석이다
- private 생성자를 갖는다
- 단일 객체 참조 변수를 정적 속성으로 갖는다
- 단일 객체 참조 변수가 참조하는 단일 객체를 반환하는 getInstance() 정적 메서드를 갖는다
- 단일 객체는 쓰기 가능한 속성을 갖지 않는 것이 정석이다
Template Method Pattern
상위 클래스의 견본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴
- 상위 클래스에 공통 로직을 수행하는 템플릿 메서드와 하위 클래스에 오버라이딩을 강제하는 추상 메서드 또는 선택적으로 오버라이딩할 수 있는 훅 메서드를 두는 패턴
- 구성 요소
- 템플릿 메서드 : 공통 로직 수행, 로직 중에 하위 클래스에서 오버라이딩한 추상 메서드/훅 메서드를 호출
- 템플릿 메서드에서 호출하는 추상 메서드 : 하위 클래스가 반드시 오버라이딩해야 한다
- 템플릿 메서드에서 호출하는 훅 메서드 : 하위 클래스가 선택적으로 오버라이딩한다
Factory Method Pattern
오버라이드된 메서드가 객체를 반환하는 패턴
- 팩터리 메서드 : 객체를 생성 반환하는 메서드
- 하위 클래스에서 팩터리 메서드를 오버라이딩해서 객체를 반환하게 하는 것
Strategy Pattern
클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴
- 구성 요소
- 전략 메서드를 가진 전략 객체
- 전략 객체를 사용하는 컨텍스트 (전략 객체의 사용자/소비자)
- 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트 (제3자, 전략 객체의 공급자)
- 템플릿 메서드 패턴과 유사한데, 같은 문제의 해결책으로 상속을 이용할 땐 템플릿 메서드 패턴, 객체 주입을 이용할 땐 전략 패턴을 사용한다
Template Callback Pattern
전략을 익명 내부 클래스로 구현한 전략 패턴
- 전략 패턴의 변형으로, DI에서 사용하는 특별한 형태의 전략 패턴
- 전략 패턴과 모든 것이 동일한데 전략을 익명 내부 클래스로 정의해서 사용한다