프로그램 아키텍쳐/디자인패턴

디자인 패턴 종류의 설명

본클라쓰 2009. 8. 27. 10:21

패턴을 구분할 때는 목적에 따라 구분하는 데 GoF(Gang of Four)가 정의한 방법으로, 유연한 방법으로 객체의 집합을 생성하는 패턴(생성패턴), uniform interface를 위하여 관계 잇는 객체의 모임을 표현하는 패턴(구조패턴), 객체의 모임 사이에 일어나는 행위를 뽑아 놓은 패턴(행위패턴)으로 구분한다.

 

 

생성패턴(creational patterns)는 new 키워드를 사용하지 않고 객체를 생성하는 유동적인 방법을 말한다.

 

Abstract Factory는 구체적인 클래스를 미리 정하지 않고, 상호 관련 있느느 객체들의 패밀리(family)를 생성하는 인터페이스를 제공하고, Builder는 복잡한 객체를 생성하는 부분과 객체 표현 부분을 분리함으로써, 서로 다른 객체 표현 부분들을 생성하더라도 동일한 객체 생성 부분을 이용할 수 있게 하며, Factory method는 생성되는 객체에 대한 결정을 서브 클래스가 할 수 있도록 객체 생성 인터페이스를 제공하며, Prototype은 원형(prototypical) 객체를 복사하는 방식으로 객체를 생성한다. 이를 통해 생성하는 객체의 종류를 동적으로 지정할 수 있다. 또한, Singleton은 전역 변수를 통해 한 개 이상의 객체를 생성하지 못하게 하는 방법을 제공한다.

 

 

구조패턴(structural patterns)은 클래스 설계에 대한 부분으로 변화와 변화하지 않는 부분을 나누어 클래스를 설계하는 방법을 제시한다.

 

Adapter는 기존 클래스의 인터페이스를 사용자가 원하는 다른 인터페이스로 변환함으로써, 서로 다른 인터페이스 때문에 상호연동을 못하는 클래스들이 연동될 수 있도록 해준다. Bridge는 시스템의 클래스들을 구현부분과 추상 부분으로 분리하여 설계함으로써 두 부분이 상호 독립적으로 바뀔 수 있도록 해준다. Composite는 부분-전체 구조(part-whole hierarchy)를 표현하기 위하여 객체들을 트리 구조로 구성한다. 이를 통하여 사용자가 개별적 객체나 복합적 객체를 동일하게 다룰 수 있다.

 

Decorator는 한 객체에 대해서 동적으로 책임사항들(responsibilities)을 덧붙일 수 있다. 이를 통하여 기능 확장을 위한 서브클래싱(subclassing)과 같은 효과를 거둘 수 있다. Facade는 서브 시스템 안의 여러 인터페이스들에 대하여 통합된 인터페이스를 제공한다. 제공되는 인터페이스를 통하여 서브 시스템의 기능을 쉽게 사용할 수 있다. Flyweight는 수많은 작은 객체들에 대해서 효율적인 공유기능을 제공한다. Proxy는 특정 객체에 대한 접근을 관리하기 위하여 해당 객체의 대리자(surrogate)를 만든다.

 

 

행위패턴(behavioral patterns)는 객체나 클래스 간의 교류 방법에 대해 정의하는 방법을 제시한다.

 

런타임시 수행하기 어려운 복잡한 제어 구조를 패턴화 시킨 것을 말한다. 행위 패턴을 사용하면 객체들간의 제어 구조보다 객체들을 어떻게 연결 시킬 것인가에 좀 더 중점을 두게 된다.

 

Chain of Responsibility는 서비스 제공자들을 체인형태로 달아둠으로써, 서비스 요청자와 서비스 제공자의 결합도(coupling)를 약화시키고, 복수개의 서비스 제공자를 둘 수 있다. Command는 소프트웨어 내에서 발생할 수 있는 명령을 객체화 시킴으로써, 명령을 기록하거나 명령을 수행하기 전 상태로 소프트웨어 상태를 복구할 때 이용할 수 있다. Interpreter는 특정 언어에 관한 문법 표현을 정의한다. 정의된 표현은 해당 언어의 문장을 해석하는데 이용된다.

 

Iterator는 자료구조의 내부적 표현과 상관없이, 저장되어 있는 자료요소들을 순차적으로 접근할 수 있는 방법을 제공한다. Mediator는 객체들의 상호 작용을 캡슐화하는 객체를 정의한다. 이를 통하여 객체들 간의 결합도를 줄일 수 있으며, 각 상호 작용을 독립적으로 변경할 수 있다. Memento는 객체지향의 캡슐화 원칙을 어기지 않으면서, 객체의 내부 상태 정보들을 찾아내어 외부 객체화한다. 객체화된 상태정보는 원 객체의 상태복구에 이용될 수 있다.

 

Observer는 한 객체의 상태에 변화가 일어나면, 해당 객체의 상태에 관심있는 모든 다른 객체들에게 자동으로 변화가 발생한 사실을 알려준다. 즉 객체들간의 일-대-다(one-to-many) 관계를 표현한다. State는 객체 상태 정보가 변함에 따라, 마치 객체의 클래스가 변하는 것처럼, 객체의 행동도 바뀌도록 해준다. Strategy는 알고리즘을 객체화하여 여러 알고리즘을 동적으로 교체가능 하도록 만든다. 알고리즘을 이용하는 클라이언트 코드와는 상관없이 알고리즘을 다양하게 바꿀 수 있다.

 

Template Method는 연산에 있어서 전체 알고리즘의 윤곽만 기술한 다음, 알고리즘의 특정 부분의 구현을 서브클래스로 맡긴다. 이를 통하여 전체 알고리즘의 구조를 변화시키지 않으면서 서브클래스가 알고리즘의 특정부분을 쉽게 변경시킬 수 있다. Visitor는 자료 구조 내에 있는 개체 요소들에게 특정 연산을 수행시키기를 원할 때 이요한다. Visitor는 연산 수행의 대상이 되는 객체들의 클래스를 바꾸지 않고도 새로운 연산을 추가할 수 있도록 도와준다.