생각자리
디자인 패턴 본문
객체지향 소프트웨어공학 (최은만 著, 한빛아카데미) 참고하여 작성했습니다.
디자인 패턴
GoF (Gang of Four)
가장 널리 알려진 디자인 패턴
총 23가지 패턴임
생성 패턴, 구조 패턴, 행위 패턴으로 분류
생성 패턴 : 객체 생성과 관련된 패턴
구조 패턴 : 복잡한 형태의 구조를 가지는 시스템을 개발하기 쉽게 만들어주는 패턴
행위 패턴 : 클래스나 객체들이 상호 작용하는 방법과 책임을 분산하는 방법을 정의
추상 팩토리 패턴
서로 관련이 있는 객체들을 통째로 묶어서 팩토리 클래스로 만들고,
이들 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴
추상 팩토리 패턴을 적용하여 관련된 객체들을 한꺼번에 캡슐화 하여 팩토리로 만들어서 일관되게 객체를 생성
객체지향프로그래밍의 기본 패턴
개념 실체 패턴
각 객체의 정보를 공유할 때 사용되는 패턴
개념 : 공유하는 정보를 담은 클래스
실체 : 공통된 정보를 가진 멤버
플레이어 역할 패턴
하나의 클래스에 다양한 역할을 표현하고자 할 때 사용
플레이어가 환경에 따라 다른 역할을 해야 할 때 사용
위임 패턴
클래스 안에서 해결하지 못하는 일을 다른 클래스의 오퍼레이션에 위임하고 그 결과를 받아 처리함
위임을 이용하려면 위임 받는 클래스와 연관 관계가 필수이며, 위임 하는 클래스에서 위임 받는 클래스로의 연관이 필요
적용 시 주의점
위임하는 클래스의 여러 메소드에서 위임 받는 메소드의 사용은 피해야함
위임은 근접한 이웃 클래스의 메소드만 이용함
계층 구조 패턴
예) 회사의 조직도 구성, 운영체제의 파일 시스템, 컴파일러 구문 트리 등
컴포지트 패턴은 계층 구조 패턴의 특수한 형태로 종속된 클래스와 슈퍼클래스가 집합 관계가 되는 경우이다.
(오른쪽 그림 참고)
생성 패턴

- 팩토리 패턴 : 어떤 클래스의 인스턴스를생성할 지 서브 클래스에서 결정하도록 생성의 책임을 미룸
기본적으로 위임의 형태를 가짐
사용 객체에 변경이 있거나 다른 객체로 대체 시, 일반 객체는 변경할 필요가 없고
팩토리만 변경하면 되기 때문에 클래스 사이에 의존성이 줄어들어 다수의 작업자가 안정적으로
작업 공유가 가능하다 - 추상 팩토리 패턴 : 팩토리 패턴과 유사하지만 팩토리 패턴과 달리 객체 그룹을 추상화한다
구체적인 클래스를 명시하지 않고 연관되는 객체 그룹을 생성하는 인터페이스를 제공한다
객체를 사용하는 모듈은 객체와 독립적으로 행동할 수 있고, 생성되어야 하는 각각의 객체에
신경을 덜 쓰게 된다. - 프로토타입 패턴 : 처음부터 일반적인 prototype(원형)을 만들어 놓고, 이를 복사하여 필요한 부분만 수정하여
객체를 만들어 사용하는 방식으로 인스턴스를 복제하여 사용하는 구조
기본적으로 위임 형태를 가짐
새로운 인스턴스가 필요할 때마다 프로토타입의 클론(복사본)을 만드는 것이다 - 싱글턴 패턴 : 싱글턴(=‘단독 개체‘, ‘독신자‘ 뜻 말고도 ‘정확히 하나의 요소만 갖는 집합‘ 의 의미)
특정 클래스의 객체를 오직 한 개로 제한한다
구조 패턴
더 큰 구조를 형성하기 위해 클래스를 어떻게 구성하고 합성하는 것의 문제를 다루며,
주로 인터페이스를 구현하여 합성한다
규모가 큰 시스템은 복잡한 구조, 많은 클래스를 가짐
복잡한 형태의 구조의 시스템을 개발하기 쉽게 만들어줌
- 컴포지트 패턴
객체 리스트에 객체를 삽입하거나 삭제하는 방법으로 객체 집단은 기존의 집단에
신속하게 덧붙이고 삭제하는 작업을 수행
객체 집단의 어느 특정한 부분에 명령을 전달하면 특정 부위의 객체 집단 모두가 그 명령을 수행함 - 데코레이터 패턴
프로그램이 실행될 때 객체에 어떤 기능을 추가해야하는 경우 사용하는 패턴
데코레이터 패턴은 별도의 객체 생성 없이 개별 객체에 데코레이터를 이용하여 동작을 쉽게 첨부할 수 있다예) 사진에 스킨을 입히는 기능 구현 시, 실행 시 스킨을 바꿀 수 있어야 하며, 이 때 스킨을 데코레이션이라함
래퍼(wrapper)란, 추가적인 동작을 첨부하기 위해 대상 객체를
원하는 기능을 가지고 있는 객체의 매개 변수로 전달하는 것을 의미한다. - 어댑터 패턴
어댑터는 서로 호환성이 없는 인터페이스들이 같이 작동할 수 있도록 도와주는 변환기를 의미어댑터는 상속을 이용하거나, 위임을 이용하여 생성함 - 퍼사드 패턴
퍼사드는 건물의 정면 또는 대문이라는 의미임
서브 시스템 내부가 복잡하여 클라이언트 코드를 사용하기 힘들 때 사용함간단한 인터페이스만 알아도 복잡한 서브시스템의 주요 기능을 사용할 수 있음외부에서 호출한 기능을 내부의 다른 클래스의 위임 형태로 전달함으로써
외부 클라이언트에게 내부 복잡한 사정을 감춤 - 프록시 패턴
프록시는 대리인이라는 의미로드하는 데 시간이 많이 걸리는 객체를 사용할 때
프록시는 컴퓨터 리소스나 시간을 많이소모하는 객체를 인스턴스화 할 때,
객체가 실제로 필요할 때 까지 생성 시간을 지연시키는 역할을 함
네트워크 작업시 트래픽이 증가하여 객체의 로드가 느릴 때
사용자에게 권한이 제한된 객체에의 접근을 허용할 때
→ 프록시 패턴을 사용함
행위 패턴
객체 사이의 행위를 캡슐화 시킨 것
반복적으로 일어나는 객체들의 상호작용을 패턴화 해놓은 것
객체들 간의 알고리즘이나 역할 분담에 관련 된 것
- 옵서버 패턴
옵서버는 관찰자라는 의미
특정 데이터나 객체를 모니터링 하다가 변화가 생기는 즉시 감지하고 알려줌
상태 변화에 대한 갱신 작업을 옵서버 객체에 위임하는 형태로 구성 - 중재자 패턴
중간에서 연결하고 통제하는 역할
여러 객체가 서로 메세지를 주고 받는 협력 행위를 특정 객체안에 캡슐화 할 수 있음
중재자를 도입하면 객체들이 다른 객체의 존재를 모르는 상태에서도 메세지를 주고 받으며 협력 가능
특정 객체를 수정하지 않고도 협력 행위만 쉽게 변경 가능 - 책임 체인 패턴
외부에서 데이터나 객체를 요청하면, 체인처럼 엮인 객체는 이를 전달받아
작업을 처리할 수 있는 객체를 내부 체인에서 찾아내어 작업을 수행한다.
내부 체인에 처리할 수 있는 객체가 없으면 객체 집합의 다른 객체로 제어를 넘긴다.
객체 사이의 결합도를 낮출 수 있다. - 커맨드 패턴
커맨드는 명령이라는 의미로, 객체의 메소드를 클래스로 만들어 캡슐화하는 패턴이다.
의존성을 제거할 수 있는 장점이 있다. - 상태 패턴
동일한 메소드를 객체의 상태에 따라 다르게 처리해야 할 때 사용
상태에 관련된 모든 행위를 하나로 모을 수 있다.