본문 바로가기

OOP/<헤드 퍼스트 디자인 패턴>, 에릭 프리먼 외16

Template Method 핵심 의도 알고리즘의 구조는 유지하면서 알고리즘의 특정 단계를 서브클래스에서 구현하거나 재정의하는 방법이다. 적용 상황 코드의 유사성이 높은데 코드의 일부분이 다른 경우, 템플릿 메소드로 공통인 부분은 상위로 올리고 다른 부분만 서브 클래스에서 구현하게 한다. 코드가 그대로 중복되는 것을 막을 수 있고, 공통 인터페이스를 사용해 메시지를 요청할 수 있다. 프레임워크를 제공할 때 자주 사용한다. 프레임워크는 사용자로 하여금 작업 흐름을 강제하는데, 템플릿 메소드에서 알고리즘 구조를 제어할 수 있다. 그러면서도 알고리즘의 각 단계는 사용자가 마음대로 지정할 수 있다. 솔루션의 구조와 각 요소의 역할 객체에게 책임을 분할하기 일련의 알고리즘을 정의한 메소드인 템플릿 메소드를 가진 상위 클래스가 필요하다. 템플.. 2023. 2. 24.
Facade 핵심 의도 서브 시스템에 있는 일련의 인터페이스들을 통합 인터페이스로 묶어준다. 사용에 필요한 서브 시스템 클래스만 이해하면 되고, 라이브러리 형태로 코드를 제공할 때 파사드에 포함된 클래스만 제공할 수 있으므로 코드 양이 줄어든다. 적용 상황 서브 시스템의 다양한 인터페이스들을 편리하게 사용하기 위해 단순화할 때 필요하다. 예를 들어 홈 씨어터를 만들어 영화를 본다면, 불을 켜고 팝콘을 튀기고 프로젝트를 켜는 등의 일련의 동작들을 ‘영화를 본다’는 하나의 인터페이스로 통합할 수 있다. Decoration vs Adapter vs Facade Decoration : 인터페이스는 변경하지 않고 책임만 추가하는 역할 Adapter : 인터페이스를 클라이언트에서 원하는 인터페이스로 바꾸는 역할 Facade :.. 2023. 2. 24.
Adapter 핵심 의도 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인스턴스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다. 적용 상황 클라이언트가 기존에 사용하고 있는 인터페이스가 있는데, 호환되지 않는 새로운 인터페이스를 기존 인터페이스(타깃)으로 사용하고 싶을 때 어댑터 패턴을 사용한다. 솔루션의 구조와 각 요소의 역할 위의 그림은 객체 어댑터의 구조. 다중 상속이 가능한 언어로 클래스 어댑터도 만들 수 있다. 타깃과 어댑티를 상속하여 어댑터를 만든다. 객체에게 책임을 분할하기 우선 클라이언트가 기존에 사용하고 있는 인터페이스가 Target이다. 그리고 새롭게 사용하려고 하는 인터페이스가 Adaptee이다. 클라이언트가 Adaptee를 Target 타입으로.. 2023. 2. 24.
Command 핵심 의도 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화하거나 메모리에 보관할 수 있다. 적용 상황 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있다. 재실행이나 우선순위에 따라 명령어를 실행하거나 배치 실행도 가능하다. 솔루션의 구조와 각 요소의 역할 객체에게 책임을 분할하기 요청을 보내는 책임과 그 요청을 처리하는 책임은 각각 Client와 Receiver에게 있다. 예를 들어 사용자가 선풍기를 켜고 싶다면 요청을 보내는 책임은 사용자에게, 선풍기를 켜는 요청을 처리하는 책임은 선풍기에게 있다. 그리고 사용자의 요청들을 중간에서 기록하고 전달하는 책임은 Invoker가 한다. 사용자가 선풍기 뿐만 아니라 부엌 불, 라디오 등을 키거나 끄고 싶다면.. 2023. 2. 24.
Singleton 핵심 의도 싱글턴 패턴은 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공한다. 적용 상황 프로그램이 실행될 때 인스턴스를 하나만 만드는 것이 더 안전하거나 경제적인 경우 사용한다. 예를 들어 스레드 풀이나 커넥션 풀, 캐시, 대화상자, 설정, 로그, 디바이스 드라이버 등이 있다. 또한 하나만 존재해야하는 객체의 생성 비용이 큰 경우 지연생성 방식으로 필요할 때 인스턴스를 생성하는 상황에 적합하다. 솔루션의 구조와 각 요소의 역할 객체에게 책임을 분할하기 객체는 원래 맡은 책임과 함께 자신이 하나만 존재하도록 관리하고 생성하는 책임을 담당한다. 따라서 싱글톤 객체는 외부로부터 생성 요청을 받아서 자신의 인스턴스를 생성한다. 싱글톤 객체는 자신만 접근할 수 있는 private 생성자를 가.. 2023. 2. 24.
Simple Factory, Factory Method, Abstract Factory Simple Factory 핵심 의도 객체 생성의 책임을 분리하자. 적용 상황 요구사항 변경에 의해 객체 생성에 필요한 코드가 자꾸 바뀌는 경우에 사용할 수 있다. 객체 생성에 필요한 과정을 템플릿처럼 정해서 다른 책임들로부터 분리할 수 있다. 솔루션의 구조와 각 요소의 역할 객체를 생성하는 부분이 요구사항에 따라 바뀌는 부분이므로, 객체 생성 책임을 별도의 객체인 Factory에 할당한다. 적용 예시 요구사항 피자 가게에서 주문 요청을 받으면 피자를 만들어 굽고 잘라서 박스에 넣으려고 한다. 이때 피자의 종류는 세 가지이고, 피자의 종류는 문자열로 구분한다. 설계 피자 가게인 PizzaStore이 피자 생성과 주문 메시지를 받을 수 있다. 이때 SimplePizzaFactory는 문자열에 따라 피자를 .. 2023. 2. 24.