- 디자인 패턴(Design Pattern)
개념
디자인 패턴이 주는 이점
- GoF 디자인 패턴
GoF란 1995년에 Addison-Wesley 에서 출간된 "Design Patterns of Reusable Object-Oriented Software"라는 책의 저자들을 의미한다. 4명의 저자들은 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissdes를 의미한다
- 생성 패턴(Creational Patterns)
객체의 생성 과정에 관여를 해서 유연성을 높이고 코드의 유지/보수를 쉽게하기 위한 GoF 디자인 패턴이다.
범위를 클래스와 객체로 나눈 기준
클래스
인 디자인 패턴은 객체가 아닌 클래스에 적용되는 범위를 가졌다.객체
인 디자인 패턴은 클래스가 아닌 객체에 적용되는 범위를 가졌다.범위 | 생성 패턴 | 의도 |
---|---|---|
클래스 | Factory Method | 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내린다. (객체 생성을 서브클래스로 위임하여 캡슐화함) |
객체 | Abstract Factory | 구체적인 클래스를 지정하지 않고 인터페이스를 통해 서로 연관되는 객체들을 그룹으로 생성해서 추상적으로 표현하는 디자인 패턴 |
객체 | Builder | 작게 분리된 인스턴스를 건축하듯이 조합하여 객체를 생성하는 디자인패턴 |
객체 | Prototype | 원본 객체를 복사함으로써 객체를 생성함 |
객체 | Singleton | 어떤 클래스의 인스턴스는 하나임을 보장하고 어디서든 참조할 수 있도록 함 |
- 구조 패턴(Structural Patterns)
구조 패턴은 클래스나 객체들을 조합해서 더 큰 구조로 만들어주는 GoF 디자인 패턴이다.
범위를 클래스와 객체로 나눈 기준
클래스
인 패턴은 객체가 아닌 클래스에 적용되는 범위를 가졌다.객체
인 패턴은 클래스가 아닌 객체에 적용되는 범위를 가졌다.범위 | 구조 패턴 | 의미 |
---|---|---|
클래스/객체 | Adapter | 클래스의 인터페이스를 다른 인터페이스로 변환하여 다른 클래스가 이용할 수 있도록 하고, 서로 다른 인터페이스를 가진 두 클래스를 Adapter 클래스로 인터페이스를 통일 시켜 사용하는 방법이다. 호환되지 않는 인터페이스 때문에 함께 사용할 수 없는 클래스의 인터페이스를 변환하여 함께 작동할 수 있게 해주는 패턴이라고 할 수 있다. |
객체 | Bridge | 구현부에서 추상층을 분리하여 각자 독립적으로 확장할 수 있게 함 |
객체 | Composite | 객체들의 관계를 트리 구조로 구성하여 복합 객체와 단일 객체를 구분없이 다룸 |
객체 | Decorator | 주어진 상황 및 용도에 따라 어떤 객체에 다른 객체를 덧붙이는 방식 |
객체 | Facade | 서브시스템에 있는 인터페이스 집합에 대해 하나의 통합된 인터페이스(Wrapper) 제공 |
객체 | Flyweight | 크기가 작은 여러 개의 객체를 매번 생성하지 않고 가능한 한 공유할 수 있도록 하여 메모리를 절약함 |
객체 | Proxy | 접근이 어려운 객체로의 접근을 제어하기 위해 객체의 Surrogate나 Placeholder를 제공 |
- 행위 패턴(Behavioral Patternss)
행위 패턴은 클래스나 객체들이 서로 상호작용하는 방법, 어떤 작업이나 알고리즘을 적합한 객체에 할당하는 것을 정의하는 패턴이다
범위를 클래스와 객체로 나눈 기준
클래스
인 패턴은 객체가 아닌 클래스에 적용되는 범위를 가졌다.객체
인 패턴은 클래스가 아닌 객체에 적용되는 범위를 가졌다.범위 | 행위 패턴 | 의미 |
---|---|---|
클래스 | Interpreter | 문법 규칙을 클래스화한 구조를 갖는 SQL 언어나 통신 프로토콜 같은 것을 개발할 때 사용한다. |
클래스 | Template Method | 상위 클래스에서는 추상적으로 표현하고 그 구체적인 내용은 하위 클래스에서 결정된다. |
객체 | Chain of Responsibility | 책임들이 연결되어 있어 내가 책임을 못 질 것 같으면 다음 책임자에게 자동으로 넘어가는 구조이다. |
객체 | Command | 명령어를 각각 구현하는 것보다는 하나의 추상 클래스에 메서드를 하나 만들고 각 명령이 들어오면 그에 맞는 서브 클래스가 선택되어 실행한다. |
객체 | Iterator | 반복이 필요한 자료구조를 모두 동일한 인터페이스를 통해 접근할 수 있도록 메서드를 이용해 자료구조를 활용할 수 있도록 해준다. |
객체 | Mediator | 클래스간의 복잡한 상호작용을 캡슐화하여 한 클래스에 위임해서 처리한다. |
객체 | Memento | Ctrl + z 와 같은 undo 기능 개발할 때 유용한 디자인패턴. 클래스 설계 관점에서 객체의 정보를 저장한다. |
객체 | Observer | 어떤 클래스에 변화가 일어났을 때, 이를 감지하여 다른 클래스에 통보해준다. |
객체 | State | 동일한 동작을 객체의 상태에 따라 다르게 처리해야 할 때 사용한다. |
객체 | Strategy | 알고리즘 군을 정의하고 각각 하나의 클래스로 캡슐화한 다음, 필요할 때 서로 교환해서 사용할 수 있게 해준다. |
객체 | Visitor | 각 클래스의 데이터 구조로부터 처리 기능을 분리하여 별도의 visitor 클래스로 만들어놓고 해당 클래스의 메서드가 각 클래스를 돌아다니며 특정 작업을 수행한다. |