[디자인 패턴] Gof의 디자인 패턴이란?

최근들어 디자인 패턴을 다시 학습하고 싶다는 생각이 강해졌었습니다. 

그래서 디자인 패턴에 관련해 학습을 하며 블로그에 정리할 예정입니다. 총 세 편으로 생각하고 있고, 생성 패턴 / 구조 패턴 / 행위 패턴으로 나누어서 코드와 함께 정리할 예정입니다.

오늘은 디자인 패턴이 무엇인지 개념을 알아보고 생성 패턴 / 구조 패턴 / 행위 패턴의 특징을 간단히 정리해 볼 것입니다.

 

우선, 디자인 패턴이란 무엇일까?

디자인 패턴은 개발하면서 발생하는 반복적인 문제들을 어떻게 해결할 것인지에 대한 해결 방안입니다.

쉽게 말해 프로그래밍 세계에서의 가이드북인 것이죠. 📖

코드를 짜는데 자꾸만 중복되는 코드가 생길 때 어떻게 하면 방지할 수 있는지 궁금할 때 디자인 패턴이라는 가이드북을 펼쳐보면 됩니다.

 

디자인 패턴하면 꼭 GoF의 디자인 패턴이라는 것이 보입니다.

1995년 GoF(Gang of Four)라고 불리는 네 사람들이 디자인 패턴을 세 가지로 분류하며 구체화 하여 책을 썼고, 그리고 이 분류가 소프트웨어 공학에서 많이 사용되기때문에 이를 GoF의 디자인 패턴이라고 합니다. 본 글에서도 GoF의 디자인 패턴에서 소개된 23개 패턴을 정리해 볼 것입니다.

 

1) 생성 패턴

생성 패턴은 이름 그대로 객체의 생성과 관련된 패턴입니다.

객체의 생성과 참조 과정을 캡슐화하여 객체가 생성되거나 변경되어도 프로그램 구조가 영향을 받지 않도록 프로그램에 유연성을 더해줍니다. 

이름 의도
추상 팩토리 패턴 동일한 주제의 다른 팩토리를 묶어 줍니다.
빌더 패턴 생성과 표현을 분리해 동일한 생성 절차에서도 다른 표현 결과를 만들어 냅니다.
팩토리 메서드 패턴 객체 생성을 서브 클래스로 위임해 캡슐화 합니다.
프로토타입 패턴 원본 객체를 복제해 객체를 생성합니다.
싱글톤 패턴 클래스의 인스턴스가 하나임을 보장하고 어디서든 참조할 수 있도록 합니다.

 

2) 구조 패턴

구조 패턴은 클래스나 객체를 조합해 더 큰 구조로 만들 수 있게 해주는 패턴입니다.

예를 들어 서로 다른 인터페이스를 갖는 객체를 하나로 묶어 단일 인터페이스를 제공하거나, 객체들을 묶어 새로운 기능을 제공합니다. 구조 패턴은 객체를 묶어 새로운 구조를 만듭니다.

이름 의도
어댑터 패턴 클래스의 인터페이스를 다른 클래스도 함께 이용할 수 있도록 변환합니다.
브리지 패턴 구현과 추상층을 분리해 각자 독립적으로 발전시킬 수 있게 합니다.
컴포지트 패턴 (합성 패턴) 0개, 1개 혹은 그 이상의 객체를 묶어 하나의 객체로 이용합니다.
데코레이터 패턴 기존 객체에 다른 객체를 덧붙이는 방식으로, 매서드에 새로운 행동을 추가하거나 오버라이드 합니다.
퍼싸드 패턴 인터페이스 집합에 접근할 수 있는 통합된 인터페이스를 제공합니다.
플라이웨이트 패턴 크기가 작은 유사한 객체를 매번 생성하지 않고 공유하도록 하여 생성·조작하는 비용을 절감합니다.
프록시 패턴 접근이 어려운 객체로의 접근을 제어하기 위해 대역을 제공합니다.

 

3) 행위 패턴

행위 패턴은 클래스나 객체들이 서로 상호작용하는 방법이이나 어떤 알고리즘을 어떤 객체에 할당하는 것이 좋을지를 정의하는 패턴입니다. 즉, 객체나 클래스의 상호작용과 책임 분배 방법에 대해 정의하는 패턴입니다. 

하나의 객체로 수행할 수 없는 작업을 여러 객체로 분배하면서 결합도를 최소화 할 수 있도록 도와줍니다.

이름 의도
책임 연쇄 패턴 객체가 요청을 처리하지 못하면 요청이 다음 객체로 넘어갑니다.
커맨드 패턴 요청을 객체 형태로 캡슐화하여 재사용하거나 취소할 수 있도록 저장합니다.
인터프리터 패턴 언어의 문법 규칙을 클래스로 표현하고 이를 기반으로 특정 입력을 해석하여 실행합니다.
반복자 패턴 접근이 잦은 객체에 대해 동일한 인터페이스를 사용합니다. 여러 집합에 대해 일관된 방식으로 반복할 수 있습니다.
중재자 패턴 객체들의 상호작용을 캡슐화하여 새로운 객체로 정의합니다. 객체간 결합도를 낮추고 재사용성을 높입니다.
메멘토 패턴 복원을 위해 특정 시점에서 객체 내부 상태를 객체화해서 저장하는 패턴입니다.
옵서버 패턴 객체의 변화를 상속되어있는 다른 객체들에게 알려 자동으로 갱신될 수 있게 하는 패턴입니다.
상태 패턴 객체의 상태에 따라 동일한 동작을 다르게 행동해야할 때 사용합니다.
전략 패턴 동일한 계열의 알고리즘을 캡슐화하여 클라이언트가 런타임에 이를 선택하여 사용하도록 합니다.
탬플릿 메서드 패턴 상위 클래스에서 구조를 정의하고 하위 클래스에서 각기 다른 구체적인 처리를 합니다. 
방문자 패턴 객체 구조와 연산 작업의 결합을 없애고 유지보수성을 높입니다. 연산 작업은 각 클래스를 '방문'하여 수행합니다.

 

마무리하며

디자인 패턴의 개념을 알아보고 각각 패턴의 특징을 알아보았습니다.

 

디자인 패턴은 공부해두면 언젠가 필요할 때 많은 도움이 될 것이라고 생각합니다.

수학의 공식과 비슷한 느낌이 들어요. 

 

다음에는 생성 패턴의 종류를 자세히 알아보고, 코드와 함께 어떤 상황에서 적용할 수 있을지도 생각해 볼 것입니다. 감사합니다.