아래는 GOF 디자인 패턴 24가지에 대한 짧은 장단점입니다.
해당 내용만으로는 이해하기 힘드실 수도 있지만, 앞으로 패턴 하나하나 자세히 내용을 다룬 게시물을 작성하려 합니다.
Creational Patterns
1. Singleton Pattern
1) 장점:
- 응용 프로그램 전체에서 클래스의 단일 인스턴스를 보장합니다.
- 인스턴스에 대한 전역 access 지점을 제공합니다.
2) 단점:
- Global state 때문에 테스트 가능성을 저해할 수 있습니다.
- 제대로 구현하지 않으면 동시성 문제가 발생할 수 있습니다.
2. Facotry Method Pattern
1) 장점:
- 인스턴스화를 하위 클래스에 위임하여 개체를 flexibility 하게 만들 수 있습니다.
- Creator와 concrete 간의 느슨한 결합(loose coupling)을 지원합니다.
2) 단점:
- 여러 변형이 존재하는 경우 하위 클래스가 proliferation될 수 있습니다.
- 코드의 복잡성을 초래할 수 있습니다.
3. Abstract Factory Pattern
1) 장점:
- 관련 개체 패밀리를 만들기 위한 인터페이스를 제공합니다.
- 생성된 개체 간의 호환성을 보장합니다.
2) 단점:
- 새로운 제품 변형을 추가하려면 추상 팩토리 인터페이스와 모든 구현을 수정해야 합니다.
- 코드 복잡성과 유지보수 작업을 증가시킬 수 있습니다.
4. Builder Pattern
1) 장점:
- 복잡한 개체를 만드는 단계별 프로세스를 제공합니다.
- 유연성을 제공하고 동일한 construction 프로세스를 서로 다르게 표현할 수 있습니다.
2) 단점:
- 별도의 builder 클래스를 만들어야 하므로 코드베이스 크기가 늘어날 수 있습니다.
- 속성 수가 적은 개체의 경우 번거로울 수 있습니다.
5. Prototype Pattern
1) 장점:
- 기존 개체를 복제하여 새 개체를 생성할 수 있습니다.
- 복잡한 객체를 만드는 유연한 접근 방식을 제공합니다.
2) 단점:
- 개체를 복제하면 복잡한 중첩 구조에서 deep copy 문제가 발생할 수 있습니다.
- 각 클래스에 대해 clone() 메서드를 구현해야 합니다.
(추가) Object Pool Pattern
1) 장점:
- 재사용 가능한 개체 pool을 관리하여 개체 생성 overhead 줄입니다.
- 비용이 많이 드는 리소스를 재사용하여 성능을 향상시킵니다.
2) 단점:
- 개체 할당 및 할당 해제 관리가 복잡해질 수 있습니다.
- 개체를 제대로 release 하지 않으면 메모리 사용량이 증가할 수 있습니다.
Structural Patterns
7. Adapter Pattern
1) 장점:
- 호환되지 않는 인터페이스를 가진 개체를 함께 사용할 수 있습니다.
- 코드를 수정하지 않고 기존 클래스를 재사용할 수 있습니다.
2) 단점:
- Adapter 클래스의 형태로 추가 복잡성을 초래할 수 있습니다.
- 과도하게 사용하면 코드 복잡도가 높아질 수 있다.
8. Bridge Pattern
1) 장점:
- 추상화를 구현에서 분리하여 독립적으로 변경할 수 있도록 합니다.
- 추상화와 구현을 모두 확장하고 수정할 수 있는 유연성을 제공합니다.
2) 단점:
- 특히 추상화와 구현이 많은 경우 추가적인 복잡성을 초래할 수 있습니다.
- 과도한 클래스 계층 구조를 방지하기 위해 신중한 설계가 필요합니다.
9. Composite Pattern
1) 장점:
- 개별 개체 및 개체의 구성을 균일하게 처리합니다.
- 구조물에 새 구성요소를 쉽게 추가할 수 있습니다.
2) 단점:
- 단순한 사용을 위해 설계가 지나치게 일반적이고 복잡하게 만들어질 수 있습니다.
- 깊이 nest 된 구조물에 대한 잦은 작업이 있을 경우 성능에 영향을 미칠 수 있습니다.
10. Decorator Pattern
1) 장점:
- 런타임에 동작을 개체에 동적으로 추가합니다.
- 기능 확장을 위한 하위분류에 유연한 대안을 제공합니다.
2) 단점:
- 많은 수의 작은 클래스가 발생하여 코드베이스가 복잡해질 수 있습니다.
- 여러 개의 decorator를 결합하면 복잡성이 증가합니다.
11. Facade Pattern
1) 장점:
- 복잡한 하위 시스템에 대한 단순화된 인터페이스를 제공합니다.
- 시스템 복잡성을 숨기고 사용 편의성을 향상합니다.
2) 단점:
- 기본 하위 시스템이 광범위한 경우 bloated 한 전면 클래스가 만들어질 수 있습니다.
- 중요한 세부 정보를 숨기고 사용자 임의 수정을 제한할 수 있습니다.
12. Flyweight Pattern
1) 장점:
- 여러 개체 간에 공통 데이터를 공유하여 메모리 사용량을 줄입니다.
- 유사한 데이터를 가진 개체 수를 줄임으로써 성능을 향상합니다.
2) 단점:
- 공유 상태 관리에 추가적인 복잡성이 발생합니다.
- 공유 데이터의 양에 따라 장단점이 달라지므로 모든 유형의 개체에 적용할 수는 없습니다.
Behavioral Patterns
13. Observer Pattern
1) 장점:
- 개체 간의 일대일 종속성을 만들어줍니다.
- 관찰자와 피사체 사이의 loose coupling을 활성화합니다.
2) 단점:
- 대규모 시스템에서 사용할 때 잠재적인 메모리 누수 및 성능 문제를 방지해야 합니다.
- 복잡한 업데이트 흐름으로 이어질 수 있습니다.
14. Mediator Pattern
1) 장점:
- 통신 로직을 중앙 집중화하여 구성 요소 간의 loose coupling을 촉진합니다.
- 여러 개체 간의 상호 작용을 단순화합니다.
2) 단점:
- Mediator는 신중하게 설계되지 않으면 monolithic 한 요소가 될 수 있다.
- 많은 개체가 서로 통신해야 할 경우 복잡성을 가중시킬 수 있습니다.
15. Strategy Pattern
1) 장점:
- 런타임에 알고리즘을 동적으로 선택할 수 있습니다.
- 교체 가능한 구성 요소를 사용하는 것을 권장합니다.
2) 단점:
- 다양한 변화가 있는 경우 strategy가 너무 많아질 수 있습니다.
- 코드베이스의 복잡성을 증가시킬 수 있습니다.
16. Template Method Pattern
1) 장점:
- 하위 클래스가 특정 구현을 제공할 수 있도록 알고리즘 구성을 정의합니다.
- 유사한 알고리즘에 재사용 가능한 구조를 제공합니다.
2) 단점:
- 완전히 사용자 임의 수정이 가능한 접근 방식에 비해 유연성이 제한될 수 있습니다.
- 여러 변형이 필요한 경우 광범위한 클래스 계층 구조가 발생할 수 있습니다.
17. Chain of Responsibility Pattern
1) 장점:
- 개체 chain이 요청을 처리할 수 있도록 합니다.
- 시스템의 다른 부분에 영향을 미치지 않고 핸들러를 추가하거나 수정할 수 있는 유연성을 제공합니다.
2) 단점:
- chain이 제대로 구성되지 않은 경우 요청이 처리되지 않을 수 있습니다.
- chain을 정의하고 관리하는 데 복잡성을 초래할 수 있습니다.
18. Command Pattern
1) 장점:
- 요청을 개체로 캡슐화하여 요청의 매개 변수화 및 queuing을 허용합니다.
- 기존 코드를 수정하지 않고 새 명령을 유연하게 추가할 수 있습니다.
2) 단점:
- 많은 명령 변형이 필요한 경우 복잡한 명령 계층 구조가 될 수 있습니다.
- 명령 개체 생성에 의해 코드베이스의 크기가 늘어날 수 있습니다.
19. Iterator Patten
1) 장점:
- 집합의 요소에 액세스 할 수 있는 일관적인 방법을 제공합니다.
- 다수의 순회 전략을 지원합니다.
2) 단점:
- 여러 Iterator를 동시에 사용하는 경우 추가 오버헤드를 발생시킬 수 있습니다.
- 모든 collection 유형에 적합하지 않을 수 있습니다.
20. Memento Pattern
1) 장점:
- 개체의 내부 상태를 캡처하고 복원할 수 있습니다.
- 실행 취소/재실행 작업을 위한 메커니즘을 제공합니다.
2) 단점:
- 여러 상태를 저장해야 하는 경우 상당한 메모리를 사용할 수 있습니다.
- Memento 개체가 올바르게 캡슐화되도록 주의해야 합니다.
21. State Pattern
1) 장점:
- 내부 상태가 변경될 때 개체의 동작을 변경할 수 있습니다.
- 상태별 동작을 캡슐화하여 복잡한 조건을 단순화합니다.
2) 단점:
- 상태가 많은 경우 클래스 수가 증가하고 복잡성이 증가할 수 있습니다.
- 상태 전환을 신중하게 관리해야 할 수 있습니다.
22. Interpreter Pattern
1) 장점:
- 언어 또는 문법의 표현을 정의합니다.
- 식을 해석하고 평가할 수 있습니다.
2) 단점:
- 문법을 설계하고 Interperter를 구현하는 것은 어려울 수 있다.
- 복잡한 식에 대한 성능이 저하될 수 있습니다.
23. Visitor Pattern
1) 장점:
- 작업과 작업 개체를 분리합니다.
- 기존 클래스를 수정하지 않고 새 작업을 쉽게 추가할 수 있습니다.
2) 단점:
- Visitor를 허용하도록 요소 계층 구조를 수정해야 합니다.
- Visitor 구현이 많은 경우 복잡성을 증가시킬 수 있습니다.
24. Null Object Pattern
1) 장점:
- 개체 참조가 null인 경우 default 동작을 제공합니다.
- 잠재적인 NullPointerExcetions를 줄이면서 null을 확인할 수고를 줄여줍니다.
2) 단점:
- null 개체가 실제 개체의 동작을 모방해야 하는 경우 추가 오버헤드를 발생시킬 수 있습니다.
- 신중하게 사용하지 않으면 실제 오류나 누락된 개체를 숨길 수 있습니다.
'Study > Software Architecture' 카테고리의 다른 글
[디자인패턴] 생성패턴(5) - Prototype Pattern (프로토타입 패턴) (0) | 2023.05.19 |
---|---|
[디자인패턴] 생성패턴(4) - Builder Pattern (빌더 패턴) (0) | 2023.05.18 |
[디자인패턴] 생성패턴(3) - Abstract Factory Pattern (추상 팩토리 패턴) (0) | 2023.05.18 |
[디자인패턴] 생성패턴(2) - Factory Method Pattern (팩토리 메소드 패턴) (1) | 2023.05.16 |
[디자인패턴] 생성패턴(1) - Singleton Pattern (싱클턴 패턴) (0) | 2023.05.14 |