디자인 패턴이란

suhan cho·2022년 12월 10일
0

디자인 패턴이란

  • 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책

생성패턴

팩토리 메소드

의도

  • 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴

문제

  • 물류 관리 앱을 개발 시, 첫 번째 버전은 트럭 운송만 처리가능 하여 대부분 코드가 Truck클래스에 있다.
    -> 만약 해상물류에서 추가해달라고 한다하면?
    대부분이 Truck클래스에 있어 Ship클래스 추가시 전체 코드를 변경

해결책

  • new 객체 생성 직접 호출들을 특별한 팩토리 메서드에 대한 호출들로 대체하라
  • 여전히 new연산자를 통해 생성되지만 팩토리 메서드 내에서 호출되고 있다.
  • 팩토리 메서드를 사용하는 코드는 클라이언트 코드라고도 불리며, 다양한 자식 클래스들에서 실제로 반환되는 여러 제품 간의 차이에 대해 알지 못한다.

구조


1. 제품: 인터페이스를 선언한다. 인터페이스는 생성자와 자식 클래스들이 생성할 수 있는 모드 객체에 공통
2. 구상 제품들: 제품 인터페이스의 다양한 구현들
3. 크리에이터: 새로운 제품 객체들을 반환하는 팩토리 메서드를 선언한다. 반환 유형이 제품 인터페이스와 일치해야 한다
4. 구상 크리에이터: 기초 팩토리 메서드를 오버라이드하여 다른 유형의 제품을 반환하게 한다.

추상 팩토리

의도

  • 관련 객체들의 구상 클래스들을 지정하지 않고도 관련 객체들의 모음을 생성할 수 있도록 하는 생성패턴

문제

  • 가구 판매장을 위한 프로그램을 만들고 있다고 가정
  1. 관련 제품들로 형성된 패밀리(제품군), 예: char(의자) + sofa(소파) + coffeeTable
  2. 해당 제품군의 여러 가지 변형, 예를들어 chair + sofa + coffeeTable를 modern, victorian, ArtDeco와 같은 변형 제공
  • 기존 같은 패밀리 내에 있는 다른 가구 객체들과 일치하는 스타일을 가지도록 할 방법 필요

해결책


1. 각 제품 패밀리에 해당하는 개별적인 인터페이스를 명시적으로 선언하는 것


2. 추상 팩토리 패턴을 선언하는 것

  • ModernFurnitureFactory는 모던 객체들만 생성 가능

  • 클라이언트들은 함께 작업하는 팩토리의 구상 클래스에 대해 신경을 쓰지 않아도 된다

구조


1. 추상 제품들: 제품 패밀리를 구성하는 개별 연관 제품들의 집합에 대한 인터페이스
2. 구상 제품들: 그룹화된 추상 제품들의 다양한 구현들(의자/소파)은 주어진 변형(빅토리안/현대식)에 구현되어야 한다.
3. 추상팩토리: 인터페이스는 각각의 추상 제품들을 생성하기 위한 여러 메서들의 집합을 선언
4. 구상 팩토리들: 추상 팩토리의 생성 메서드들을 구현 제품들의 특정 변화들에 해당

싱글톤

의도

  • 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근 지점을 제공하는 생성 디자인 패턴

문제

  • 두가지 문제를 동시에 해결함으로써 단일 책임 원칙을 위반
  1. 클래스에 인스턴스가 하나만 있도록 한다.
  2. 해당 인스턴스에 대한 전역 접근 지점을 제공

해결책

  1. 다른 객체들이 싱글턴 클래스와 함께 new 연산자를 사용하지 못하도록 디폹 생성자를 비공개로 설정
  2. 생성자 역할을 하는 정적 생성 메서드를 만든다.

구조

  • 국가는 하나의 정부를 갖는 거 처럼
  1. 정적 메서드 getInstance를 선언 이 메서드는 자체 클래스의 같은 인스턴스를 반환

구조패턴

어댑터

의도

  • 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴

문제

  • xml로 받았는데 분석은 json으로만 가능 할 때

해결책

  • 어뎁터를 만들어 협업 가능하도록 한다

구조


1. 클라이언트: 프로그램의 기존 비즈니스 로직을 포함하는 클래스
2. 클라이언트 인터페이스 : 다른 클래스들이 클라이언트 코드와 공동 작업할 수 있도록 하는 프로토콜
3. 서비스 : 일반적으로 타사 또는 레거시의 유용한 클래스 호환되지 않아 바로 사용 불가
4. 어댑터: 서비스 양쪽 작동할 수 있는 클래스 서비스 객체를 래핑동안 클라이언트 인터페이스 구현

브리지

의도

  • 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조로 나눈 후 각각 독립적으로 개발 할 수 있도록 한다.

복합체

데코레이터

의도

  • 객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서 위 행동들을 해당 객체들에 연결

퍼사드

의도

  • 라리브러리에 대한, 프레임워크에 대한 또는 다른 클래스들의 복잡한 집합에 대한 단순화된 인터페이스 제공

플라이웨이트

의도

  • 각 객체에 모든 데이터를 유지하는 대신 여러 객체 간에 상태의 공통 부분들을 공유하여 사용할 수 있는 RAM에 더 많은 객체를 포함할 수 있도록 한다.

행동패턴

책임 연쇄

의도

핸들러들의 체인​(사슬)​을 따라 요청을 전달할 수 있게 해주는 행동 디자인 패턴입니다. 각 핸들러는 요청을 받으면 요청을 처리할지 아니면 체인의 다음 핸들러로 전달할지를 결정합니다.

반복자

의도

컬렉션의 요소들의 기본 표현​(리스트, 스택, 트리 등)​을 노출하지 않고 그들을 하나씩 순회할 수 있도록 하는 행동 디자인 패턴입니다.

중재자

의도

메멘토

옵서버

의도

당신이 여러 객체에 자신이 관찰 중인 객체에 발생하는 모든 이벤트에 대하여 알리는 구독 메커니즘을 정의할 수 있도록 하는 행동 디자인 패턴입니다.

상태

의도

객체의 내부 상태가 변경될 때 해당 객체가 그의 행동을 변경할 수 있도록 하는 행동 디자인 패턴입니다. 객체가 행동을 변경할 때 객체가 클래스를 변경한 것처럼 보일 수 있습니다.

전략

의도

알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴입니다.

템플릿 메서드

비지터

출처: https://refactoring.guru/ko/design-patterns/what-is-pattern

profile
안녕하세요

0개의 댓글