GoF의 디자인 패턴에는 23가지가 있으나..!
핵심으로 여겨지는 14가지 패턴에 대한 정의, 그리고 특징을 가져와봤다.
어떤 것들이 있는지 알기 위함 정도로 봐주면 좋을 듯 하다!
깊이 있는 이해를 위해서라면 무조건 예제를 보는 것을 추천!!
- 생성 패턴
: 객체 인스턴스를 생성하는 패턴, 클라이언트와 해당 클라이언트가 생성해야 하는 객체 인스턴스 사이 연결을 끊어주는 패턴- 싱글턴 패턴(Singleton Pattern)
- 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해주는 패턴(유일한 인스턴스 제공)
- 생성자를 명시적으로 private으로 선언해서 외부에서 여러 개의 인스턴스를 만들지 못하게 막음
- static변수를 사용해 하나의 인스턴스만 유지
- 전역적으로 접근 가능
- get 메서드 제공
- 메모리 절약 & 성능 최적화 (불필요한 객체 생성 방지)
- 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해주는 패턴(유일한 인스턴스 제공)
- 추상 팩토리 패턴
- 구상 클래스에 의존하지 않고도 서로 연관, 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공
- 관련된 객체들의 그룹을 생성하는 인터페이스를 제공하는 패턴
- 객체 생성 로직을 캡슐화→ 서브 클래스에서 구체적 구현을 결정하도록 유도
- 장점
- 관련된 객체들을 일관성 있게 생산 가능
- 클라이언트에서 구체적 클래스에 의존하지 x (느슨한 결합, 유연성 증가)
- 새로운 제품군 추가는 쉬움
- 단점
- 새로운 객체 추가는 어려움(인터페이스 수정)
- 팩토리 메소드 패턴
- 단일 객체 생성에 집중
- 객체 생성을 서브 클래스에서 결정하도록 하는 패턴
- new 키워드를 직접 사용하지 X, 팩토리 메서드 통해 객체 생성
- 클라이언트 코드가 구체적 클래스에 의존 X (유연성 증가)
- 싱글턴 패턴(Singleton Pattern)
- 행동 패턴
: 클래스와 객체들이 상호작용하는 방법, 역할을 분담하는 방법 다루는 패턴- 템플릿 메소드 패턴
- 알고리즘의 골격(템플릿)을 정의
- 실행순서 정해놓고, 일부 메서드는 서브클래스에서 오버라이드하도록 설계
- 알고리즘 일부 단계(구체적인 로직)를 서브클래스에서 구현O
- 알고리즘의 골격(템플릿)을 정의
- 싱글턴 패턴 (위와 동일)
- 상태 패턴
- 객체 내부 상태가 바뀜에 따라 객체 행동 바꿀 수 있음
- 객체 내부 상태를 클래스로 캡슐화 → 상태 변경 시 객체 동작도 변경되도록
- if-else, switch-case 대신 상태별 클래스를 만들어 다형성으로 해결
- 조건문 없이 유연하게 상태를 추가할 수 있음
- 자판기, 문(잠김/열림), tcp연결 등 상태가 중요한 곳에서 유용하게 사용됨
- 반복자 패턴
- 컬렉션 구현방법을 노출하지 않으면서 집합체 내 모든 항목에 접근하는 방법 제공
- for문 없이도 객체 순회 가능
- 컬랙션과 반복 로직을 분리해 유지보수가 용이
- hasNext(), next() 등의 인터페이스를 제공해 일관된 접근방식 제공
- 자바 Iterator인터페이스와 유사
- 컬렉션 구현방법을 노출하지 않으면서 집합체 내 모든 항목에 접근하는 방법 제공
- 전략 패턴
- 특정 콘텍스트에서 알고리즘을 별도로 분리하는 설계 방법
- 알고리즘을 직접 수정하지 않고도 쉽게 교체 가능하며 OCP(개방-폐쇄 원칙, Open-Closed Priciple)와 SRP(단일 책임 원칙, Single Responsibility Principle)을 지킬 수 있음
- 일반적으로 if - else 로 구성된 코드 블록이 비슷한 기능을 수행하는 경우 전략 패턴을 사용함으로써 코드를 확장 가능하도록 변경할 수 있음
- 옵저버 패턴
- 객체 상태 변화 발생 시, 해당 변화를 의존하는 다른 객체에 자동으로 통보하는 디자인 패턴 ,일대다 의존성을 정의함
- 이벤트 처리, 구독-발행 모델에 사용됨
- 옵저버 패턴 핵심 개념
- 주체(관찰자에 알림을 전달하는 객체)/ 옵저버/ 알림 매커니즘/ 1:N 관계
- 템플릿 메소드 패턴
- 구조 패턴
: 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
(객체간 상호작용을 단순화하고 유연하게 만들어주는 디자인 패턴)
- 데코레이터 패턴
- 객체에 추가요소를 동적으로 더할 수 있음
- 기존 클래스를 상속하지 않고도, 기능을 확장할 수 있도록 도와주는 패턴
- 기존 객체 수정X, 추가적 기능 덧붙일 수 있음
- 프록시 패턴
- 특정 객체로의 접근을 제어하거나 추가적인 작업을 할 수 있도록 함
- 성능 최적화, 접근 제어, 로깅, 지연 초기화 등을 위한 용도
- 주요 특징
- 대리 객체: 실제 객체를 대신해 그 객체에 대한 접근을 제어하는 객체
- 실제 객체: 실제 작업을 수행하는 객체
- 접근 제어
- 지연 초기화 (객체가 실제로 필요할 때까지 초기화하기 않도록 함)
- 객체 생성 비용이 클 경우 프록시를 통해 객체를 지연 로딩, 캐싱해 성능 최적화 가능
- 어댑터 패턴
- 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환함
- 호환되지 않는 인터페이스를 가진 두 객체를 연결
- 두 클래스의 인터페이스가 다를 때 변환해주는 중재자 역할
- 종류
- 클래스 어댑터 패턴
- 상속을 이용해 두 클래스 간 호환을 맞춤
- 객체 어댑터 패턴
- 객체를 사용해 어댑터 구현
- 클래스 어댑터 패턴
- 상호 운용성 증가, 복잡도 증가
- 컴포지트 패턴
- 객체를 트리구조로 구성해서 부분-전체 계층구조를 구현
- 일관된 방식으로 개별 객체와 복합 객체 다루기 가능
- 장점: 새로운 Leaf, Composite 추가가 쉽고, 클라이언트 코드 변경이 필요 없음
- 단점: 구조가 복잡해질 수 있으며 메모리 사용량 증가 가능
- 퍼사드 패턴
- 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어줌
- 복잡한 서브시스템의 인터페이스를 단순화 → 클라이언트가 더 쉽게 사용할 수 있도록 하는 구조적 디자인 패턴
- 패턴 구조
- 서브시스템: 개별 클래스로 이뤄진 복잡 시스템
- 퍼사드: 서브 시스템을 감싸는 간단한 인터페이스 제공하는 클래스
- 클라이언트: 퍼사드를 통해 접근
- 데코레이터 패턴
'백엔드' 카테고리의 다른 글
JPA란?(Java Persistence API) with 영속성 컨텍스트 (0) | 2024.12.01 |
---|---|
STOMP? STOMP 딥다이브 (0) | 2024.11.24 |
웹소켓이란? 웹소켓을 채팅구현하기 -이론편 (with Spring) (5) | 2024.11.03 |
⚠️ 스프링 시큐리티(Spring Security)와 그 작동 구조 (0) | 2024.10.05 |
[SERVER] CORS preflight request 에러 (0) | 2024.07.21 |