디자인 패턴이란
- 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책
생성패턴
팩토리 메소드
의도
- 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴
문제
- 물류 관리 앱을 개발 시, 첫 번째 버전은 트럭 운송만 처리가능 하여 대부분 코드가 Truck클래스에 있다.
-> 만약 해상물류에서 추가해달라고 한다하면?
대부분이 Truck클래스에 있어 Ship클래스 추가시 전체 코드를 변경
해결책
- new 객체 생성 직접 호출들을 특별한 팩토리 메서드에 대한 호출들로 대체하라
- 여전히 new연산자를 통해 생성되지만 팩토리 메서드 내에서 호출되고 있다.
- 팩토리 메서드를 사용하는 코드는 클라이언트 코드라고도 불리며, 다양한 자식 클래스들에서 실제로 반환되는 여러 제품 간의 차이에 대해 알지 못한다.
구조
1. 제품: 인터페이스를 선언한다. 인터페이스는 생성자와 자식 클래스들이 생성할 수 있는 모드 객체에 공통
2. 구상 제품들: 제품 인터페이스의 다양한 구현들
3. 크리에이터: 새로운 제품 객체들을 반환하는 팩토리 메서드를 선언한다. 반환 유형이 제품 인터페이스와 일치해야 한다
4. 구상 크리에이터: 기초 팩토리 메서드를 오버라이드하여 다른 유형의 제품을 반환하게 한다.
추상 팩토리
의도
- 관련 객체들의 구상 클래스들을 지정하지 않고도 관련 객체들의 모음을 생성할 수 있도록 하는 생성패턴
문제
- 가구 판매장을 위한 프로그램을 만들고 있다고 가정
- 관련 제품들로 형성된 패밀리(제품군), 예: char(의자) + sofa(소파) + coffeeTable
- 해당 제품군의 여러 가지 변형, 예를들어 chair + sofa + coffeeTable를 modern, victorian, ArtDeco와 같은 변형 제공
- 기존 같은 패밀리 내에 있는 다른 가구 객체들과 일치하는 스타일을 가지도록 할 방법 필요
해결책
1. 각 제품 패밀리에 해당하는 개별적인 인터페이스를 명시적으로 선언하는 것
2. 추상 팩토리 패턴을 선언하는 것
구조
1. 추상 제품들: 제품 패밀리를 구성하는 개별 연관 제품들의 집합에 대한 인터페이스
2. 구상 제품들: 그룹화된 추상 제품들의 다양한 구현들(의자/소파)은 주어진 변형(빅토리안/현대식)에 구현되어야 한다.
3. 추상팩토리: 인터페이스는 각각의 추상 제품들을 생성하기 위한 여러 메서들의 집합을 선언
4. 구상 팩토리들: 추상 팩토리의 생성 메서드들을 구현 제품들의 특정 변화들에 해당
싱글톤
의도
- 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근 지점을 제공하는 생성 디자인 패턴
문제
- 두가지 문제를 동시에 해결함으로써 단일 책임 원칙을 위반
- 클래스에 인스턴스가 하나만 있도록 한다.
- 해당 인스턴스에 대한 전역 접근 지점을 제공
해결책
- 다른 객체들이 싱글턴 클래스와 함께 new 연산자를 사용하지 못하도록 디폹 생성자를 비공개로 설정
- 생성자 역할을 하는 정적 생성 메서드를 만든다.
구조
- 정적 메서드 getInstance를 선언 이 메서드는 자체 클래스의 같은 인스턴스를 반환
구조패턴
어댑터
의도
- 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴
문제
- xml로 받았는데 분석은 json으로만 가능 할 때
해결책
구조
1. 클라이언트: 프로그램의 기존 비즈니스 로직을 포함하는 클래스
2. 클라이언트 인터페이스 : 다른 클래스들이 클라이언트 코드와 공동 작업할 수 있도록 하는 프로토콜
3. 서비스 : 일반적으로 타사 또는 레거시의 유용한 클래스 호환되지 않아 바로 사용 불가
4. 어댑터: 서비스 양쪽 작동할 수 있는 클래스 서비스 객체를 래핑동안 클라이언트 인터페이스 구현
브리지
의도
- 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조로 나눈 후 각각 독립적으로 개발 할 수 있도록 한다.
복합체
데코레이터
의도
- 객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서 위 행동들을 해당 객체들에 연결
퍼사드
의도
- 라리브러리에 대한, 프레임워크에 대한 또는 다른 클래스들의 복잡한 집합에 대한 단순화된 인터페이스 제공
플라이웨이트
의도
- 각 객체에 모든 데이터를 유지하는 대신 여러 객체 간에 상태의 공통 부분들을 공유하여 사용할 수 있는 RAM에 더 많은 객체를 포함할 수 있도록 한다.
행동패턴
책임 연쇄
의도
핸들러들의 체인(사슬)을 따라 요청을 전달할 수 있게 해주는 행동 디자인 패턴입니다. 각 핸들러는 요청을 받으면 요청을 처리할지 아니면 체인의 다음 핸들러로 전달할지를 결정합니다.
반복자
의도
컬렉션의 요소들의 기본 표현(리스트, 스택, 트리 등)을 노출하지 않고 그들을 하나씩 순회할 수 있도록 하는 행동 디자인 패턴입니다.
중재자
의도
메멘토
옵서버
의도
당신이 여러 객체에 자신이 관찰 중인 객체에 발생하는 모든 이벤트에 대하여 알리는 구독 메커니즘을 정의할 수 있도록 하는 행동 디자인 패턴입니다.
상태
의도
객체의 내부 상태가 변경될 때 해당 객체가 그의 행동을 변경할 수 있도록 하는 행동 디자인 패턴입니다. 객체가 행동을 변경할 때 객체가 클래스를 변경한 것처럼 보일 수 있습니다.
전략
의도
알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴입니다.
템플릿 메서드
비지터
출처: https://refactoring.guru/ko/design-patterns/what-is-pattern