[디자인패턴] GOF (Gang Of Four)의 23가지 디자인 패턴 장단점 총정리

Study/Software Architecture · 2023. 5. 14. 01:48
반응형

아래는 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 개체가 실제 개체의 동작을 모방해야 하는 경우 추가 오버헤드를 발생시킬 수 있습니다.

-         신중하게 사용하지 않으면 실제 오류나 누락된 개체를 숨길 수 있습니다.

 

반응형