본문 바로가기

IT Tech

디자인 패턴(Design Pattern)정리 / Wanna Be 컴잘알

728x90

1. 디자인 패턴이란 ?

 

-어떤 문제를 해결하기 위한 방법 혹은 모델

-자주 쓰는 설계, 구조상의 문제를 정리한 패턴의 집합

 

 

2. 디자인 패턴의 종류

 

1. 생성 패턴: 객체 생성에 관련된 패턴

 

A. 싱글톤 패턴: 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴. 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다.
=> 글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.

 

+ 인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용.

+ 두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아지는 장점

- 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스터들 간에 결합도가 높아져 객체 지향설계 원칙에 어긋납니다.

 

B. 추상 팩토리: 팩토리 메서드 패턴을 좀 더 캡슐화한 방식이다. 서로 관련이 있는 객체들을 통째로 묶어서 팩토리 클래스로 만들고, 이들 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴

(여러 주제를 가진 팩토리 자체를 추상화)

 

C. 팩토리 메서드: 같은 부류의 제품을 만드는데 들어가는 구성품 마다 팩토리를 만들어서 객체를 형성

 

 

-클래스 다이어그램

D. 프로토타입(원형):

 

2. 구조 패턴: 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴

 

A. 컴퍼지트: 클라이언트가 복합 객체나 단일 객체를 동일하게 취급하는 것을 목적으로 합니다.

컴포지트의 의도는 트리 구조로 작성하여, 전체-부분(Whole-part)관계를 표현하는 것 입니다.

+전체-부분 관계를 트리 구조로 표현하고 싶을 경우

+전체-부분 관계를 클라이언트에서 부분, 관계 객체를 균일하게 처리하고 싶을 경우

-UML 다이어그램

-객체 다이어그램

 

B. 데코레이터: 객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴

Component는 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의. 즉, 클라이언트는 Component를 통해 실제 객체를 사용한다.

 

 

3. 행위 패턴: 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴

 

(결합도를 최소화 하는 것에 중점을 둔다.)

A. 옵저버: 어떤 객체에 이벤트가 발생했을 때, 이 객체와 관련된 객체들(옵저버)에게 통지하도록 하는 디자인 패턴을 말합니다. 즉, 객체의 상태가 변경되었을 때, 특정 객체에 의존하지 않으면서 상태의 변경을 관련된 객체들에게 통지하는 것이 가능해집니다.

보통 신문 구독시 출판사와 구독자(옵저버) 간의 관계로 비유된다.

 

B. 스테이트 패턴: 객체가 특정 상태에 따라 행위를 달리하는 상황에서, 자신이 직접 상태를 체크하여 상태에 따라 행위를 호출하지 않고, 상태를 객체화 하여 상태가 행동을 할 수 있도록 위임하는 패턴이다.

 

 

C. 스트레이티지(전략) 패턴: 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐하 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말합니다.

D. 커맨드패턴: 객체가 할 수 있는 행위를 메소드가 아닌 클래스로 만들어 캡슐화 하는 패턴이다.

전략패턴과의 차이점은 전략패턴은 다양한 전략에 대해 설정하는 반면, 커맨드패턴은 단일 행위 자체에 집중하고 그 단일 행위에 대한 사전/사후 동작들을 정의하는 방법이다.

E. 템플릿메소드: 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴. 즉, 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.

동일한 기능을 상위클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현할 수 있도록 한다.

 

728x90