본문 바로가기
java

전략, 옵저버, 팩토리메소드, 데코레이터, 템플릿, 데코레이터 패턴

by 포잉띠 2024. 7. 24.

1. 전략 패턴 (Strategy Pattern)

정의

전략 패턴은특정 작업을 수행하는 알고리즘들을 정의하고, 해당 알고리즘들을 독립적으로 변경하게 해준다.

런타임 시에 알고리즘(내부 로직)을 선택할 수 있게 해준다. 

설명 

  • 인터페이스를 통해 다양한 알고리즘을 캡슐화하고, 이 인터페이스를 구현하는 여러 클래스들을 만들어 각각의 알고리즘을 구현함
  • 클라이언트 코드에서는 인터페이스를 통해 알고리즘을 사용하므로, 알고리즘을 쉽게 변경할 수 있음

사용하는 상황 

  • 여러 알고리즘(또는 전략)이 있고, 이들을 런타임에 선택해야 하는 경우
  • 알고리즘을 캡슐화하여 클라이언트 코드와 독립적으로 변경하고자 하는 경우

 

2. 옵저버 패턴 (Observer Pattern)

정의 

옵저버 패턴은 객체의 상태 변화를 관찰하고, 상태 변화가 있을 때 다른 객체들에게 자동으로 알림을 보내는 패턴

설명 

  •  주체(Subject)옵저버(Observer)로 구성됨. 주체는 상태 변화를 알리는 역할을 하고, 옵저버는 그 변화를 감지하고 반응함
  • 주체는 상태가 변경되면 모든 등록된 옵저버들에게 알림을 보냄.

사용하는 상황 

  • 한 객체의 상태 변화가 다른 객체들에게 자동으로 알림을 보내야 하는 경우
  • 이벤트 중심의 시스템에서 여러 컴포넌트가 특정 이벤트에 반응해야 하는 경우

 

3. 팩토리 메소드 패턴 (Factory Method Patten)

정의

팩토리 메소드 패턴은 객체 생성의 책임을 서브클래스로 넘기는 패턴.
이를 통해 객체 생성 과정을 캡슐화하고 클라이언트 코드와 객체 생성 로직을 분리할 수 있음.

설명 

  • 인터페이스나 추상 클래스를 통해 객체 생성 메소드를 정의하고, 서브클래스에서 이 메소드를 구현하여 구체적인 객체를 생성
  • 객체 생성 로직을 캡슐화하여 코드의 유연성과 재사용성을 높일 수 있음

사용하는 상황

  • 객체 생성의 책임을 서브클래스로 넘기고, 클라이언트 코드와 객체 생성 로직을 분리하고자 하는 경우
  • 구체적인 클래스의 인스턴스를 생성할 때 직접적인 의존성을 피하고자 하는 경우
  • 예시: 다양한 데이터페이스 연결 객체 생성, 여러 종류의 문서 객체 생성 

 

4. 템플릿 메소드 패턴 (Template Method Patten)

정의

템플릿 메소드 패턴은 알고리즘의 구조를 정의하고, 일부 단계를 서브클래스에서 구현하도록 하는 패턴.

알고리즘의 골격을 정의하고, 세부 구현은 서브클래스에게 맡김

설명 

  • 추상 클래스에서 알고리즘의 주요 단계를 정의하고, 일부 단계를 추상메소드로 선언해 서브클래스에서 구현하도록함
  • 알고리즘의 공통 부분은 추상클래스에 정의하고, 세부 구현은 서브클래스에 맡김으로써 코드 중복을 줄임

사용하는 상황 

  • 알고리즘의 구조를 정의하고, 일부 단계를 서브클래스에서 구현하도록 하는 경우
  • 알고리즘의 공통적인 부분은 슈퍼클래스에 두고, 세부적인 부분은 서브클래스에서 변경하고자 하는 경우
  • 예시 : 데이터 처리 파이프라인, 테스트 프레임워크에서 테스트 실행 흐름

 

5. 데코레이터 패턴 (Decorator Patten)

정의 

데코레이터 패턴은 객체에 동적으로 새로운 기능을 추가할 수 있게 해주는 패턴.

상속을 사용하지 않고도 객체의 기능을 확장할 수 있음.

설명 

  • 기본 기능을 제공하는 컴포넌트와, 그 컴포넌트를 감싸 추가 기능을 제공하는 데코레이터로 구성됨
  • 데코레이터는 원래 객체의 인터페이스를 구현하거나 원래 객체를 포함하여 기능을 확장함

사용하는 상황 

  • 객체에 추가적인 기능을 동적으로 부여하고자 하는 경우
  • 상속 대신 구성(컴포지션)을 통해 기능을 확장하고자 하는 경우
  • 예시 : 파일 입출력 스트림에 버퍼림, 암호화 등의 기능 추가, GUI컴포넌트에 스크롤바, 테두리 등의 기능 추가

 

6. 싱글톤 패턴 (Singleton Pattern)

정의 

싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하고, 이 인스턴스를 전역에서 공유하도록 하는 패턴 

설명 

  • 클래스의 생성자를 private로 선언하여 외부에서 직접 인스턴스를 생성하지 못하게함.
  • 클래스 내부에서 인스턴스를 생성하고, 이 인스턴스를 반환하는 정적 메소드를 제공
  • 애플리케이션 전체에서 동일한 인스턴스를 사용해야 할 때 유용하다.  

사용하는 상황

  • 클래스의 인스턴스를 하나만 생성하고 이를 전역적으로 접근할 수있도록해야하는 경우
  • 애플리케이션 전역에서 공유되는 자원이 필요한 경우
  • 예 : 애플리케이션 설정 객체, 데이터베이스 연결 객체, 로그 관리 객체