디자인패턴

원래벌레·2022년 6월 11일
0
post-custom-banner

💎 디자인 패턴 : 자주 반복되는 설계유형을 증명된 솔루션을 체계적으로 정리한 것

💍 디자인패턴을 사용하는 이유 :

  • 주방가구를 파는 홈인테리어 업체에서 사용하는 CAD 소프트웨어에서는 사용자에게 여러가지 스타일의 객체를 화면에 렌더링 하는 것이 설계 할 때의 가장 큰 문제점이다. 이를 해결하기 위한 방법이 디자인패턴을 이용하는 것이다. 기존에 클라이언트 클래스 안에서 클래스의 요소가 되는 Cabinet과 같은 클래스를 선언하여 안에 추가를 하게 되면, Cabinet의 스타일을 정의하기 위해서 또 많은 과정이 필요하다. 이 대신에, 이미 Style의 내용이 정의된 Class를 선언을 하고, Style을 살펴 볼 수있는 MyStyle 클래스를 하나 선언하여 Style의 내용을 볼 수 있도록 하면 클라이언트가 런타임내에서 여러가지 다양한 스타일을 쉽고 빠르게 볼 수 있게된다.

💎 기본 패턴

💍 개념 실체 패턴

  • 개념 실체 패턴이란 공통된 값을 가지는 속성들을 개념 클래스에 저장하고, 각각의 객체마다 다른 값을 가지는 속성을 실체 패턴에 저장을 하여. 개념과 실체에 대한 클래스가 1 대 N의 관계를 갖는 패턴을 이야기 합니다.

💍 플레이어 역할 패턴

  • 하나의 클래스가 여러가지 역할을 할 수 있을 때 해당 클래스의 역할을 설정 할수 있게해주는 패턴이다. 이 패턴은 클래스에 대응되는 여러가지 역할 클래스가 선언되어져 있고, 상황에 맞게 클래스에서 생성된 객체에 역할 클래스의 객체를 연관시켜 클래스의 역할을 설정해준다.

💍 위임 패턴

  • 어떤 하나의 클래스가 해결하지 못하는 일을 가지고 있을 때, 이를 해결 하기 위해서 다른 클래스에 해당 일을 위임하고, 결과를 받아와 문제를 해결하는 방법이다.

💍 계층구조 패턴

  • 클래스를 트리 형태의 구조로 만들때 사용

💎 생성 패턴 : 간단한 블록의 코드로 여러가지 다양한 객체를 생성

  • 특징 :
    1) 실행 시간에 객체의 다양한 버전을 생성
    2) 생성한 객체에 제한을 가함 - ex) 클래스 인스턴스 생성을 하나로 제한함

💍 팩토리란 : 다른 타입의 객체를 생성하는 클래스

팩토리의 이점

1) 클래스 구현과 객체 생성이 독립적 ( 결합이 느슨함 )
2) 클라이언트가 객체를 생성하는 클래스를 알 필요가 없음. ( 인터페이스, 메소드, 파라미터만 알면 됨)
3) 클라이언트가 코드를 수정 없이도, 다른 타입의 객체를 생성위한 클래스 추가가 쉬움.
4) 이미 존재하는 객체를 재사용할 수 있음.
(클라이언트가 직접 객체 생성하는 경우 항상 새 객체가 생성)

팩토리 패턴의 3종류

1) 심플 팩토리 패턴 : 인터페이스가 객체 생성 방법 노출없이 객체를 생성
2) 팩토리 메소드 패턴 : 인터페이스가 객체를 생성할 수 있게 해줌. 하지만 객체 생성을 위한 클래스를 결정하는 것을 서브클래스에 미룸
3) 추상 팩토리 패턴 : 추상 팩토리는 클래스를 노출하거나 지정하지 않고, 관련된 오브젝트를 만드는 인터페이스임. 이 패턴은 내부적으로 다른 객체를 생성하는 다른 팩토리의 객체를 제공

💍 팩토리 메소드 패턴 :

  • 객체 생성을 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할 지는 서브클래스엥서 이루어지도록 생성의 책임을 미룸

  • 예를 들어서 자동차 클래스의 생성을 런타임에서 이루어진다고 할 때, 자동차 클래스는 위임 생성자 메소드를 실행시켜, 클라이언트의 런타임 선택에 맞춰 Kia, 현대 와 같은 클래스를 통하여 자동차 객체를 생성하고, 이를 반환한다.

💍 추상 팩토리 패턴 :

  • 객체의 구체적인 클래스를 명시하지 않고서, 그 객체와 관련되거나 의존하는 그룹을 생성하는 인터페이스를 제공

  • 객체 그룹을 생성하거나 의존적인 과계의 객체를 생성할 때, 객체 생성을 추상화 해주는 패턴

  • 예를 들어서 컴퓨터 객체를 만든다 할 때, 컴퓨터 객체는 삼성이나 LG와 같은 회사가 만드므로 이를 삼성컴퓨터, LG컴퓨터로 생성을 해주어야 할 것이다. 여기서만 보면 이제 팩토리 메소드 패턴과 같지만, 여기서 추상 팩토리 패턴은 삼성과 LG컴퓨터 의 부품인 마우스,키보드,모니터 등도 각 자회사의 부품을 사용 할 것이다. 그렇기 때문에 삼성컴퓨터라는 클래스에 삼성마우스,삼성키보드,삼성모니터가 포함되어 캡슐화된 형태로 돼있는 것이 추상 팩토리 패턴인 것이다.

💍 프로토 타입 패턴 :

  • 객체를 사용할 때, 다시 생성하지 않고 복사해서 사용하는 패턴

  • 클론 메소드 : 객체를 만들고, 그 객체속에 데이터를 원하는 형태로 만들어주는 메소드 이다. 클론 메소드에 일반 데이터를 넘겨주면 원하는 객체가 생성됨

  • 재사용 되는 객체를 clone하여 저장하고, 이를 이용하는 패턴이다.
    db를 통해서 어떠한 데이터를 가져오는 일은 많은 비용을 발생하게 하는데, 하나의 객체에 db 데이터를 추가해주고 이를 프로토타입 패턴으로 생성해주면 그 이후에 다시 db데이터 내용을 불러오지 않고, db 내용이 저장된 객체를 통하여 db 데이터를 이용 할 수 있다.

💍 싱글톤 패턴

  • 목적 : 어떤 클래스 S의 인스턴스를 하나만 만들고 싶을 때, 어플리케이션 전체에 하나만 필요한 경우

  • 패턴의 핵심
    1) 클래스 S의 생성자를 private로 선언한다.
    2) 클래스 안에 private로 정적 속성을 선언한다.
    3) 클래스의 객체를 리턴하는 public 메소드를 만들어준다.

💎 구조패턴 : 더 큰 구조를 형상하기 위하여 클래스와 객체를 어떻게 합성하느냐의 문제를 다루는 패턴

  • 방법 : 인터페이스를 상속받아 구현하여 합성

  • 독립적으로 개발될 클래스 라이브러리의 합성

  • 구조화 패턴
    1) 새로운 기능을 구현하기 위하여 객체를 구성하는 방식
    2) 런타임에 객체 구조를 변경
    3) 유연성, 확장성

💍 컴포지트 패턴

  • 목적 : 객체의 트리를 나타내는데 사용

패턴 요약 :

  • 기본 클래스와 이를 포함하는 컨테이너 클래스를 재귀적인 형태로 표현 -> 재귀적 합성 (또는 재귀적 포함 관계)
  • 객체들의 집합을 다룰 때 유용
  • ex) 폴더 내부의 파일

💍 데코레이터 패턴

  • 목적 : 런타임에 객체의 기능을 추가하기 위하여 사용하는 패턴

  • 패턴 요약 : 패키지의 기능을 제공할 수 있는 유일 수단인 인터페이스를 정의

  • ex) GUI설계 - 상속을 이용하면 융통성이 없어짐, 화면 구성 클래스와 추가기능들을 분리 하나의 화면구성 클래스에 여러 개의 기능들을 연결되도록 구성

  • 주의 : 클래스들을 패키지로 구성할 필요는 없음, 하나 이상의 클래스들이 파사드를 위하여 사용될 수도 있음

  • 기능을 겹겹이 쌓아서 거대한 하나를 만드는 패턴이다.

💍 어댑터 패턴

목적 : 이미 개발된 클래스(레거시 시스템이 될 수 있음)의 인터페이스를 다른 클래스의 요구에 맞게 변환해주는 패턴

  • 어댑터 : 서로 호환성이 없는 인터페이스들이 같이 작동할 수 있도록 도와주는 변환기

패턴요약 :

  • 원하는 인터페이스를 추상클래스로 정의(target)

  • 이를 상속하는 어댑터 클래스를 만들고, 이를 요구하는 기능을 가진 클래스 (adaptee)와 메시지를 교환하게 함

적용분야 :

  • 기존에 존재하는 클래스를 재사용하고 싶지만, 원하는 인터페이스와 맞지 않을 때

  • 미리 정해져 있지 않은 클래스들과 상호작용할 수 있는 재사용 가능 클래스를 만드려는 경우

  • 어댑터 패턴은 상속을 이용한 방법과 위임을 이용한 방법 두가지를 통해서 사용 할 수 있다. 먼저 상속을 이용한 방법은 기존에 이용하던 class에 request() 메소드를 작성하고 이 request메소드를 상속받는 Adapter 클래스와 재사용을 원하는 클래스를 implements 하여 클래스들을 통합하는 방법이 있고, 위임을 이용한 방법은 Target 클래스를 Adapter가 상속을 받고, 정적 속성으로 Adaptee 클래스를 가져와 Adaptee 객체를 통하여 Adaptee 메소드를 사용한다.

💍 퍼사드 패턴

퍼사드 : 건물의 정면 또는 대문

목적 :

  • 서브시스템 내부가 복잡하여 클라이언트 코드를 사용하기 힘들 때 사용

  • 클래스 패키지에 인터페이스를 제공하기 위하여 사용

패턴 요약 :

  • 패키지의 기능을 제공할 수 있는 유일 수단인 인터페이스를 정의

주의 :

  • 클래스들을 패키지로 구성할 필요는 없음

  • 하나 이상의 클래스들이 퍼사드를 위하여 사용될 수도 있음

방법 :

  • 외부에서 호출한 기능을 내부의 다른 클래스에 위임 형태로 전달

  • 외부 클라이언트에게는 내부의 복잡한 사정을 감춤

ex) 항공권 예약 시스템

  • Airline 클래스를 퍼사드 패턴으로 정의

  • Client가 가장 중요한 질의나 예약 오퍼레이션에 접근할 수 있고, Airline 클래스를 제외한 다른 클래스에 접근할 수 없음

  • 다만, 퍼사드 안에 있는 findFlight, makeBooking등을 통해 간접적으로 호출

💍 프록시 패턴

목적 :

  • 시간이 많이 소요되는 불필요한 복잡한 객체를 생성하는 시간을 간단한 객체로 돌림

  • 한 클래스 객체가 다른 클래스 객체에 속도에 영향을 미칠 때, 사용하는 패턴이다.
    ex) 한 클래스 내에 다른 클래스를 이용하여 이미지를 가져오는데 이미지가 올라오는 시간이 꽤 걸림 ->> 이미지를 임시로 설정할 수 있는 것으로 먼저 대체하고 나중에 이미지를 업로드 한다.

패턴 요약 :

  • 특정 객체에 접근을 조절하기 위하여 대리자를 세움

  • 필요할 때만 비싼 대가의 기능을 접근하도록 프로시를 사이에 둠

사용 사례 :

  • 로딩하는데 시간이 많이 소모되는 큰 그림과 같은 객체를 사용하고자 할 때 -> 이미지 대신 심볼이나 대체물을 화면에 출력

  • 네트워크 작업에서 네트워크 사용이 증가해 로딩이 느린 객체

  • 사용자에게 권한이 제한된 객체의 접근을 허용하게 할 때

profile
학습한 내용을 담은 블로그 입니다.
post-custom-banner

0개의 댓글