KimMK

디자인 패턴 본문

C++/디자인 패턴

디자인 패턴

KimMK 2023. 3. 11. 16:39

디자인 패턴은 소프트웨어 설계에서 공통으로 발생하는 문제에 대해 자주 쓰이는 설계 방법을 정리한 패턴이다.

모듈의 세분화된 역할이나 모듈간의 인턴페이스 구현 방식을 설계할 때 참조할 수 있는 전형적인 해결 방식을 정리한 것으로 디자인 패턴을 통해 설계 문제, 해결 방법, 해결책을 언제 적용해야 할 지, 그 결과로 무엇인지 등을 알 수 있다.

 

1995년 GoF(Gang of Four)라고 불리는 Erich Gamma, Richard Helm, Ralph Johnson, John Vissides가 처음으로 디자인 패턴을 구체화하였다. GoF의 디자인 패턴에는 생성 패턴 5개, 구조 패턴 7개, 행위 패턴 11개로 총 23개의 패턴으로 구성된다.

 

디자인 패턴을 사용하여 개발할 경우,

개발의 효율성, 유지보수성, 운용성이 높아지고 프로그램의 최적화에 도움이 된다.

 

 

디자인 패턴의 유형

구분 유형 설명
목적 생성 객체 인스턴스 생성에 관여
클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행하는 패턴
구조 더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴
행위 클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴
범위 클래스 클래스 간 관련성(상속 관계를 다루는 패턴)
컴파일 타임에 정적으로 결정
객체 객체 간 관련성을 다루는 패턴
런타임에 동적으로 결정

 

생성 패턴(Create Pattern)은 객체 인스턴스를 생성하는 패턴으로, 클라이언트와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어주는 패턴이다.

즉, 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경돼도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공해준다.

  • 특징
    1. 생성 패턴은 시스템이 어떤 구체적인 클래스를 사용하는지에 대한 정보를 캡슐화한다.
    2. 생성 패턴은 이들 클래스의 인스턴스들이 어떻게 만들고 붙는지에 대한 정보를 완전히 가린다
  • 종류
    1. Builder
    2. Prototype
    3. Factory Method
    4. Abstract Factory
    5. Singleton

 

 

 

구조 패턴(Structral Pattern)은 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴으로, 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.

  • 특징
    1. 서로 독립적으로 개발한 클래스 라이브러리를 마치 하나인 것처럼 사용할 수 있다.
    2. 여러 인터페이스를 합성해 서로 다른 인터페이스들의 통일된 추상을 제공한다.
    3. 인터페이스나 구현을 복합하는 것이 아니라 객체를 합성하는 방법을 제공한다.
  • 종류
    1. Bridge
    2. Decorator
    3. Facade
    4. Flyweight
    5. Proxy
    6. Composite
    7. Adapter

 

 

 

행위 패턴(Behavioral Pattern)은 클래스나 객체들이 서로 상호작용하는 방법이나 어떤 태스크, 알고리즘을 어떤 객체에 할당하는 것이 좋을지를 정의하는 패턴이다.

즉, 객체나 클래스의 교류 방법에 대해 정의하는 것이다.

행위 패턴은 하나의 객체로 수행할 수 없는 작업을 여러 객체로 분배하면서 결합도를 최소화 할 수 있도록 도와준다

 

  • 특징
    1. 객체들 사이의 상호작용을 더 유연하게 만든다
    2. 객체 간의 결합도를 낮추어 객체들 간의 상호작용이 쉽게 변경될 수 있도록 한다.
  • 종류
    1. Mediator
    2. Interpreter
    3. Iterator
    4. Template Method
    5. Observer
    6. State
    7. Visitor
    8. Command
    9. Strategy
    10. Memento
    11. Chain of Responsibility

 

 

 

디자인 패턴은 코드 구조를 구성하는 방법을 제공하는 것이다.

클래스에 적용되는 패턴은 코드 구조를 구성하는 클래스들 간의 관계를 정의하고, 이를 컴파일러가 빌드할 때 정적으로 결정한다. 따라서, 컴파일 타임에 결정된 패턴을 변경하려면 코드를 수정하고 다시 컴파일해야 한다.

 

반면, 객체에 적용되는 패턴은 런타임에 동적으로 객체들의 관계를 정의하고, 이를 변경할 수 있다. 따라서, 객체에 적용되는 패턴은 런타임에 유연하게 변경할 수 있으며 코드를 수정하지 않고도 객체들의 동작을 바꿀 수 있다는 장점이 있다.

 

간단한 예를 들어보면, 팩토리 메서드 패턴(Factory Method)은 클래스에 적용되는 패턴으로 객체 생성을 하위 클래스에 위임하여 객체 생성 로직을 캡슐화하고 확장성을 높인다.

반면, 전략 패턴(Strategy)은 객체에 적용되는 패턴으로 객체가 실행하는 알고리즘을 런타임에 동적으로 변경할 수 있게 한다.

 

따라서, 클래스에 적용되는 패턴은 보통 프로그램의 기본 아키텍처를 결정하고 객체에 적용되는 패턴은 프로그램의 기능을 확장하거나 유연성을 높이는 데 사용된다.

'C++ > 디자인 패턴' 카테고리의 다른 글

관찰자(Observer) 패턴  (0) 2023.03.14
싱글턴(Singleton) 패턴  (0) 2023.03.12
경량(Flyweight) 패턴  (1) 2023.03.11
명령(Command) 패턴  (0) 2023.03.11
팩토리 패턴  (0) 2023.03.10