안녕하세요 제이븐입니다 이번에는 디자인 패턴에 대해서 포스팅해보겠습니다!
디자인 패턴은 객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들을 해결하기 위해 사용되는 패턴입니다.
5개의 생성 패턴, 7개의 구조 패턴, 11개의 행위 패턴 합쳐서 총 23개의 패턴으로 구성되어있습니다.
디자인 패턴은 1994년 GoF(Gang of Four)라고 불리는 Erich Gamma(에릭 감마), Richard Helm (리처드 헬름), Ralph Johnson (랄프 존슨), John Vlissides (존 블리시디스)이라는 4명에 의해 정리되었습니다.
이 넷은 디자인 패턴:재사용성을 지닌 객체지향 소프트웨어의 핵심 요소라는 책을 발간하였고, 디자인 패턴의 개념을 프로그래밍에 적용하였습니다.
이 책에서 다양한 객체 지향 디자인 관련 문제를 해결하는 23가지 패턴을 소개합니다
저는 개인적으로 공부를 시작하면서 와 닿았던 부분은 2번의 이유가 더 컸던 것 같습니다.
"망치를 든 사람에게 모든 문제가 못으로 보인다" 라는 말이 있습니다.
다자인 패턴을 익히고 패턴이 필요하지 않고 간단하게 해결되는 문제조차 패턴을 사용하려고 한다면 그건 오히려 독이 될 수도 있습니다.
언제나 상황에 맞게 적절히 적용하는게 중요하고 매몰되지 않았으면 좋겠습니다.
기존 코드의 유연성과 재사용을 증가시키는 객체를 생성하는 다양한 방법을 제공합니다.
생성 패턴 | 요약 설명 |
---|---|
팩토리 메서드(Factory Method) | 객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴 |
추상 팩토리(Abstract Factory) | 구체적인 클래스에 의존하지 않고 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴 |
빌더(Builder) | 복잡한 객체들을 단계별로 생성할 수 있도록 하는 패턴 |
프로토타입(Prototype) | 클래스들에 의존시키지 않고 기존 객체들을 복사할 수 있도록 하는 패턴 |
싱글턴(Singleton) | 클래스의 인스턴스가 하나만 존재하도록 보장하는 패턴 |
구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명합니다.
구조 패턴 | 요약 설명 |
---|---|
어댑터(Adapter) | 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 패턴 |
브릿지(Bridge) | 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 패턴 |
복합체(Composite) | 객체들을 트리 구조로 구성한 후, 복합객체와 단일객체를 구분 없이 다루는 패턴 |
데코레이터(Decorator) | 객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서 위 행동들을 해당 객체들에 연결시키는 패턴 |
파사드(Facade) | 서브 시스템 집합에 대해 하나의 통합된 인터페이스를 제공하는 패턴 |
플라이웨이트(Flyweight) | 각 객체에 데이터를 유지하는 대신 여러 객체들의 상태의 공통 부분을 공유하여 RAM에 더 많은 객체를 포함하게 하는 패턴 |
프록시(Proxy) | 원본 객체를 대신하여 처리하게 함으로써 흐름을 제어하는 패턴 |
객체 간의 효과적인 의사소통과 책임 할당을 처리합니다.
행동 패턴 | 요약 설명 |
---|---|
책임 연쇄(Chain of Responsibility) | 핸들러의 체인을 따라 요청을 전달하는 패턴. 각 핸들러는 요청을 받으면 처리할 것인지 다음 체인의 핸들러로 전달할지를 결정합니다. |
커맨드(Command) | 요청을 객체 형태로 캡슐화하는 패턴 |
인터프리터(Interpreter) | 특정 언어를 구현하는 패턴 |
반복자(Iterator) | 객체의 기본 표현을 노출하지 않고 원소를 순서대로 순회할 수 있게하는 패턴 |
중재자(Mediator) | 객체 간의 혼란스러운 의존 관계들을 줄일 수 있는 패턴. 객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 통신하게 합니다. |
메멘토(Memento) | 객체의 구현 세부 사항을 공개하지 않으면서 해당 객체의 이전 상태를 저장하고 복원할 수 있게 해주는 패턴. |
옵저버(Observer) | 객체에 상태 변화를 관찰하고, 상태 변화에 따라 관찰하고 있는 객체들이 이를 알 수 있게 만드는 구독 매커니즘의 패턴 |
상태(State) | 객체의 내부 상태가 변경될 때 해당 객체가 그의 행동을 변경할 수 있도록 하는 패턴 |
전략(Strategy) | 알고리즘들의 패밀리를 정의하고, 캡슐화 하여 객체를 상호 교환할 수 있게하는 패턴 |
템플릿 메서드(Template Method) | 상위 클래스에서 알고리즘의 골격을 정의하고 구체적인 처리는 서브클래스에 위임해서 처리하는 패턴 |
비지터(Visitor) | 알고리즘들이 작동하는 객체들로부터 분리할 수 있도록 하는 패턴 |
GoF 디자인패턴에 대해서 포스팅 했습니다. 23개나 되는 디자인 패턴을 언제 다 외우고 적용하나에 대한 고민을 처음에 많이 했습니다.
처음에 헤드퍼스트 디자인 패턴 책을 일고 부푼 마음에 디자인 패턴으로 고칠 문제가 어디있나 찾아다녔었는데 손에 망치가 쥐어지니 모든 것을 못으로 보려고 했던 것 같습니다
개인적으로는 디자인 패턴을 쭉 한번 익히고 언제 어떻게 쓰면 좋은지 정도만 알고 있다가 필요한 시점에 적절하게 찾아서 적용하는게 좋을 것 같다고 느꼈습니다
그리고 자주 쓰이는 패턴은 익숙해지고 많이 쓰다보면서 자연스럽게 외워지는 경우도 있는 것 같습니다.
질문과 피드백은 언제나 감사합니다 :)
rxswift를 처음 사용했을때도 모든걸 rx스럽게 사용하려고 했던게 생각나네요..ㅎㅎ
항상 좋은 글 잘 읽고 있습니다.