728x90
디자인패턴 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제에 대해 자주 쓰이는 설계방법을 정리한 패턴
디자인패턴유형 (생구행)
생성패턴(생빌프로팩앱싱)
객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성방식을 구조화 캡슐화를 수행하는 패턴
- 빌더 : 복잡한 인스턴스를 조립하여 만드는구조, 생성과 표기를 분리해서 복잡한 객체를 생성
- 프로토타입 : 처음부터 일반적인 원형을 만들어놓고 그것을 복사한 후 필요한 부분만 수정하여 사용하는 패턴, 기존객체를 복제함으로써 객체를 생성
- 팩토리메서드 : 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위클래스에서 인스턴스를 생성하도록 하는 방식으로 상위클래스에서는 인스턴스를 만드는 방법만 결정하고 하위클래스에서 그 데이터의 생성을 책임지고 조작하는 함수들을 오버라이딩하여 인터페이스와 실제 객체를 생성하는 클래스를 분리할 수 있는 특성을 갖는 디자인 패턴, 생성할 객체의 클래스를 국한하지 않고 객체를 생성
- 앱스트랙 팩토리 : 구체적인 클래스의 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴으로 이 패턴을 통해 생성도니 클래스에서는 사용자에게 인터페이스(API)를 제공하고, 구체적인 구현은 클래스에서 이루어지는 패턴, 동일한 주제의 다른 팩토리를 묶음
- 싱글톤 : 전역변수를 사용 하지 않고 객체를 하나만 생성하도록 하여 , 생성된 객체를 어디에서든지 참조할수 있도록 하는 패턴, 한 클래스에 한 객체만 존재하도록 제한
구조패턴(구브데퍼플포록컴어)
더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴
- 브리지 : 기능의 클래스 계층과 구현의 클래스 계층을 연결하고 구현부에서 추상계층을 분리하여 추상화된 부분과 실제 구현 부분을 독릭접으로 확장할수 있는 디자인 패턴, 구현뿐 아니라 추상화된 부분까지 변경해야 하는 경우 활용
- 데코레이터 : 기존에 구현되어 있는 클래스에 필요한 기능을 추가해 나가는 설계 패턴으로 기능 확장이 필요할때 객체간의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주어 상속의 대안으로 사용하는 디자인 패턴, 객체의 결합을 통해 기능을 동적으로 유연하게 확장
- 퍼사이드 : 복자한 시스템에 대하여 단순한 인터페이스를 제공함 (통합된 인터페이스 제공)
- 플라이 웨이트 : 다수의 객체를 생성될 경우 모두가 갖는 본질적인 요소를 클래스 화하여 공유함으로써 메모리를 절약하고, 클래스의 경량화를 목적으로 하는 패턴, 여러개의 가상 인스턴스를 제공하여 메모리 절감
- 프록시 : '실체객체에 대한 대리 객체'로 실체 객체에 대한 접근 이전에 필요한 행동을 취할수 있게 만들어 이 점을 이용해서 미리 할당 하지 않아도 상관없는 것들을 실제 이용할때 할당하게 하여 메모리 용량을 아낄수 있으며 실체 객체를 드러나지 않게 하여 정보은닉의 역할도 수행하는 패턴, 특정객체로의 접근을 제어하기 위한 용도
- 컴포지트 : 객체들의 관계를 트리 구조로 구성하여 부분-전체계층을 표현하는 패턴, 사용자가 단일 객체와 복합객체 모두 동일하게 다루도록 하는 패턴, 복합객체와 단일객체를 동일하게 취급
- 어댑터 : 기존 생성된 클래스를 재사용 할수 있도록 중간에서 맞춰주는 역할을 하는 인터페이스를 만드틑 패턴으로 상속을 이용하는 클래스 패턴과 위임을 이용하는 인스턴스의 패턴의 두가지 형태로 사용되는 패턴
행위패턴(행미인이템옵스테비커스트메체)
클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴
- 미디에이터 : 객체지향 설계에서 객체의 수가 너무 많아지면 서로간 통신을 위해 복잡해져서 객체지향에서 가장 중요한 느슨한 결합의 특성을 해칠수 있기 때문에 이를 해결하는 방법으로 중간에 이를 통제하고 지시할수 있는 역할을 하는 중재자를 두고 중재자에게 모든것을 요구하여 통신의 빈도수를 줄여 객체지향의 목표를 달성하게 해주는 패턴, 상호작용의 유연한 변경을 지원
- 인터프리터 : 언어의 다양한 해석, 구체적으로 구문을 나누고 그 분리된 구문의 해석을 맡는 클래스를 각각 작성하여 여러 형태의 언어구문을 해석할 수 있게 만드는 패턴, 문법자체를 캡슐화 하여 사용
- 이터레이터 : 컬렉션 구현방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 반복자를 사용하여 접근 할수 있는 패턴 내부구조를 노출하지 않고 복잡객체의 원소를 순차적으로 접근가능하게 해주는 행위패턴
- 템플릿메서드 : 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체일을 수행하는 구조는 바꾸지 않으면서 특정단계에서 수행하는 내역을 바꾸는 패턴 (상위작업 구조를 바꾸지 않으면서 서브클래스로 작업의 일부분을 수행)
- 옵져버 : 한객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에 연락이 가고 자동으로 내용이 갱신되는 방법 객체의 상태변화에 따라 다른 객체의 상태도 연동, 일대다 의존
- 스테이트 : 객체상태를 캡슐화 하여 클래스화함으로써 그것을 참조하게 하는 방식으로 상태에 따라 다르게 처리할수 있도록 행위내용 변경하여 변경시 원시 코드의 수정을 최소화 할수 있고 유지보수의 편의성도 갖는 디자인 패턴 객체의 상태에 따라 행위내용을 변경
- 비지터 : 각 클래스데이터 구조로부터 처리기능을 분리하여 별도의 클래스를 만들어 놓고 해당 클래스의 메서드가 각 클래스를 돌아다니며 특정 작업을 수행하도록 만드는 패턴으로 객체의 구조는 변경하지 않으면서 기능만 따로 추가하거나 확장할때 사용하는 패턴
- 커맨드 : 실행될 기능을 캡슐화함으로써 주어진 여러기능을 실행할수 있는 재사용성 높은 클래스를 설계하는 패턴으로 하나의 추상클래스에 메서드를 만들어 각 명령이 들어오면 그에 맞는 서브클래스가 선택되어 실행되는 특징을 갖는 디자인 패턴, 요구사항을 객체로 캡슐화
- 스트레티지 : 알고리즘군을 정의하고 같은 알고리즘을 각각하나의 클래스로 캡슐화 한 다음 필요할때 서로 교환 해서 사용할수 있게 하는 패턴으로 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀수 있게 하는 패턴, 행위객체를 클래스로 캡슐화해 동적으로 행위를 자유롭게 변환
- 메멘토 : 클래스 설계관점에서 객체의 정보를 저장할 필요가 있을때 적용하는 패턴, Undo기능을 개발할 때 사용하는 패턴, 객체를 이전상태로 복구시켜야하는경우 작업취소(Undo)요청가능
- 체인오브리스판서빌리티 : 정적으로 어떤기능에 대한 처리의 연결이 하드코딩 되어 있을때 기능 처리의 연결변경이 불가능 한데 이를 동적으로 연결되어 있는 경우에 따라 다르게 처리 될수 있도록 연결한 패턴 한 요청을 2개 이상의 객체에서 처리