Design Pattern
디자인 패턴은 유사한 문제를 해결하기 위해 설계들을 분류하고
각 문제 유형별로 가장 적합한 설계를 일반화하여 체계적으로 정리해 놓은 것으로
소프트웨어 개발에서 효율성과 재사용성을 높일 수 있다.
디자인 패턴은 크게 세 분류로 나눠지며, 생성(Creational), 구조(Structural), 행위(Behavioral) 로 나뉘어진다.
객체 생성을 위한 패턴 (생성 패턴) |
구조 개선을 위한 패턴 (구조 패턴) |
행위 개선을 위한 패턴 (행위 패턴) |
- 팩토리 메서드 (Factory Method) - 추상 팩토리 (Abstract Factory) - 싱글톤 (Singleton) - 프로토타입 (Prototype) - 빌더 (Builder) |
- 어댑터 (Adapter) |
- 인터프리터 (Interpreter) - 탬플릿 메서드 (Template Method) - 커멘드 (Command) - 이터레이터 (Iterator) - 메디에이터 (Mediator) - 메멘토 (Memento) - 옵저버 (Observer) - 스테이트 (State) - 스트래티지 (Strategy) - 비지터 (Visitor) - 책임 연쇄 (Chain of Responsibility) |
생성 패턴
객체의 생성과 참조 과정을 캡슐화하여 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 하여
프로그램에 유연성을 더해주는 패턴.
싱글톤 패턴에 대해서는 정리해 놓은 글이 있으므로, 나머지 4가지 디자인 패턴을 정리해 보겠다.
1. Factory Method
: 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 인스턴스 생성 결정을 서브클래스 (자식, 하위 클래스)에서 내린다.
즉 객체 생성을 전담하는 별도의 Factory 클래스가 존재하는 디자인 패턴. 객체의 생성 코드를 별도의 클래스/메서드로 분리함으로써 객체 생성의 변화에 유연성을 더해주는 패턴이다.
2. Abstract Factory
: 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합(그룹)을 만드는 인터페이스를 제공하는 패턴.
즉 관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 유용한 디자인 패턴이다.
연관된 객체들의 그룹을 공통 인터페이스로 구현하고, 구체적 팩토리 클래스에서 추상 메서드 (인터페이스)를 오버라이드 함으로써 구체적인 객체를 생성한다.
3. Prototype
: 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제한다.
3. Builder
: 복합 객체의 생성 과정과 표현 방법을 분리하여, 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다.
구조 패턴
구조 패턴은 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴으로, 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.
1. Adapter
: 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하여 다른 인터페이스와의 호환성 문제를 해결하는 패턴.
2. Facade
: 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 퍼사드 패턴은 많은 서브시스템을 거대한 클래스로 만들어 감싸 편리한 인터페이스를 제공해준다.
3. Bridge
: 구현부에서 추상층을 분리하여 각자 독립적으로 변경 가능하고 확장이 가능하도록 하는 패턴.
즉 기능과 구현에 대해서 두 개의 별도의 클래스를 구현한다.
Abstraction / Implementor 두 개의 클래스가 분리되어있다.
3. Composite
: 객체의 결합을 통해 기능을 동적으로 확장할 수 있게 해주는 패턴. 상속 없이 객체의 기능을 동적으로 추가, 삭제(Overloading) 가능하다.
즉, 추가 기능을 Decorator 클래스로 정의한 후 필요한 Decorator 객체를 조합함으로써 추가 기능의 조합을 설계하는 방식이다.
행위 패턴
행위 패턴은 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴이다. 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.
1. Observer
: 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성하는 패턴이다.
-> One source Multiple Use
데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용하다.
2. Command
: 실행될 기능을 캡슐화 함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴이다.
즉 수행할 작업을 일반화하여 조작하고, 실행될 기능의 변경이 생기더라도 호출자 클래스를 수정없이 그대로 사용할 수 있게 해준다.
3. Strategy
: 동일 목적의 여러 알고리즘이 클래스별로 캡슐화 되어있고, 이들이 필요할 때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 패턴이다.
4. Template Method
: 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴이다.
즉 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 해준다.
5. Visitor
: 알고리즘을 객체 구조에서 분리시키는 디자인 패턴이다. 오퍼레이션이 처리할 요소의 클래스를 변경하지 않고도 새로운 오퍼레이션을 정의할 수 있게 해준다.
'CSE > Computer Science' 카테고리의 다른 글
NoSQL - 비관계형 데이터베이스, 대량 데이터 동시처리 (0) | 2021.05.03 |
---|