팩토리 메서드 패턴? 객체 생성 코드를 별도의 클래스 또는 메서드로 분리하여 객체 생성 변화에 효과적으로 대응할 수 있는 디자인 패턴 등장 배경 여러 대의 엘리베이터가 있다고 생각해보자. 사용자가 버튼 (FloorButton) 을 눌렀을 때, 여러 대의 엘리베이터 중 하나를 선택하여 이동시켜야 한다. 여기서 주어진 요청 (목적지 층과 방향) 을 받았을 때, 여러 대의 엘리베이터 중 하나를 선택하는 것을 '스케줄링' 이라고 한다. 스케줄링은 여러 가지 전략이 있을 수 있다. ex) 목적지 층과 가까우면서 목적지 층의 방향으로 이동 중인 엘리베이터 선택 ElevatorManager 클래스 : 이동 요청을 처리하는 클래스 (ThroughputScheduler 객체, ElevatorController 객체 복수..
데코레이터 패턴? 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우, 필요한 기능들만을 골라 조합하여 설계하는 디자인 패턴 ex) 기본 도로 표시 기능 (+ 차선 표시, 교통량 표시, 교차로 표시, 단속 카메라 표시) 4가지 추가 기능이 있을 때, 이 들의 조합은 총 15가지가 된다. 데코레이터 패턴을 사용하면 이를 4가지 Decorator 클래스만 구현하여 객체 형태로 조합하여 추가 기능의 조합을 구현할 수 있다. 등장 배경 네비게이션에 아래와 같은 기능이 있다고 해보자. 그리고 이를 클래스 다이어그램과 코드로 표현하면 다음과 같다. 기본 기능 : 도로를 간단한 선으로 표시 추가 기능 : 도로의 차선을 표시하는 기능 // 기본 도로 표시 클래스 public class RoadDisplay { pub..
싱글톤 패턴? 인스턴스가 오직 한 개만 생성된다는 것을 보장하고 이 인스턴스를 어디서나 사용할 수 있도록 하는 디자인 패턴 싱글톤 (Singleton) : '단 하나의 원소만을 가진 집합' 이라는 수학 이론에서 유래되었다고 한다. 단 하나의 인스턴스만을 생성하는 책임이 있으며, getInstance()를 통해 동일한 인스턴스를 반환한다. 등장 배경 프린터기가 있다고 생각해보자. 그리고 리소스를 입력 받아 이를 출력하는 print 메서드를 제공하는 Printer 클래스가 있다고 해보자. public class Printer { public Printer() { } public void print(Resource resource) { ... } } 프린터기는 한 개밖에 없다고 가정했을 때, new Print..
템플릿 메서드 패턴? 전체적으로는 동일하면서 부분적으로 다르게 작성된 메서드의 코드 중복을 최소화할 수 있는 디자인 패턴 즉, 동일한 기능을 상위 클래스에서 정의하고, 확장 또는 변화가 필요한 부분만을 서브 클래스에서 구현 상위 클래스에서 동일한 기능을 구현한 클래스를 템플릿 메서드, 하위 클래스에서 세부적인 기능을 구현하도록 오버라이딩하는 메서드를 Primitive 또는 Hook 메서드라고 한다. 등장 배경 전기를 공급받고 컴퓨터를 키는 과정을 생각해보자. LG 컴퓨터를 사용한다고 했을 때, 아래와 같은 클래스 다이어그램을 정의할 수 있을 것이다. LGComputer 클래스는 turnOn 메서드를 실행할 때, 전기가 공급되는지 확인할 필요가 있다. 아래와 같이 인터페이스로서 컴퓨터의 상태 (켜짐, 꺼짐..
전략 패턴? 전략을 쉽게 바꿀 수 있게 만들어주는 디자인 패턴 전략? - 일을 수행하는 방식, 문제 해결 알고리즘 등등 등장 배경 어떤 게임 내에서 아래와 같이 두 개의 직업이 있고, 직업별로 특정한 행동 방식이 있도록 만든다고 가정해보자. 전사 공격 시 - 근거리에서 칼 휘두르기 스킬 사용 시 - 힘을 모아 강하게 휘두르기 (강타) 궁수 공격 시 - 원거리에서 활 쏘기 스킬 사용 시 - 여러 발의 화살을 한 번에 쏘기 (멀티샷) 이를 클래스 다이어그램과 코드로 나타내면 아래와 같을 것이다. public abstract class Position { private String nickName; public Position(String nickName) { this.nickName = nickName; }..