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

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

 

반응형