1. 싱클톤(singletion) 패턴
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 보통 데이터베이스 연결 모듈에 많이 사용된다. 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할때 드는 비용이 줄어드는 장점이 있다. 하지만 의존성이 높아진다는 단점이 있다.
프로그램을 구현할 때 클래스의 인스턴스가 단 하나만 존재하게 만들려면 싱글턴 패턴을 적용하면 된다. 싱글턴 패턴은 유틸리티 클래스 구현에 적합하다. 많은 어플리케이션에서는 상태 정보, 디버깅 데이터, 특정한 지점에서 발생한 에러를 기록하는 클래스인 로거(logger)를 사용하는 경우가 많다. 로거 클래스는 싱글턴으로 구현하는 것이 좋다.
구현 방법:
(1). static 메서드만 가지는 클래스로 구현하는 것.
(2). 접근 제어 메커니즘을 이용하여 클래스의 인스턴스를 하나만 생성하고 접근하게 만드는 것.
< 코드 >
2. 추상 팩토리(factory) 패턴
생성하려는 객체의 타입이 상황에 따라 달라질 때 팩토리를 사용하면 편하다. 팩토리 패턴은 객체를 생성할때 그 객체의 생성자를 직접 호출하지 않고, 객체 생성을 담당하는 팩토리에 요청한다.
객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다. 상위 크래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요 없기 때문에 더 많은 유연성을 갖게 된다. 또한 객체 생성 로직이 따로 떼어져 있기 대문에 코드를 리팩터링하더라도 한 곳만 고칠 수 있게 되니 유지 보수성이 증가된다.
장점:
- 객체를 생성하는 코드가 프로그램이 산만하게 흩어지지 않고 객체를 생성하는 기능을 한 곳에 모아둘 수 있다.
- 클래스 타입을 정확히 몰라도 클래스 계층에 맞게 객체를 생성 할 수 있다.
- 팩토리에서 관리하는 특정한 정보나 상태, 리소스 등에 맞게 객체를 구성할 수 있다는 장점도 있다.
- 객체 생성 과정을 추상화할 수 있다.
< 코드 >
3. 옵저버(observer) 패턴
주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵서버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다. 대표적인 옵저버 패턴을 활용한 서비스로는 트위터가 있다. 옵저버 패턴의 가장 큰 장점은 결합도를 낮춘다.
- 객체와 주체(객체의 상태 변화를 보고 있는 관찰자)가 분리되는 옵저버 패턴
- 객체와 주체(객체의 상태 변화를 보고 있는 관찰자)가 합쳐진 옵저버 패턴
< 코드 >
4. 프록시(proxy) 패턴과 프록시 서버
클래스 추상화를 내부 표현과 분리하는 패턴이다. 영어단어 proxy의 뜻처럼 실제 객체에 대한 대리인 역할을 한다. 객체를 직접 다룰 수 없거나 그렇게 하기엔 시간이 너무 걸릴 때 주로 프록시를 사용한다.
대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴이다. 객체의 속성, 변환 등을 보완하며 보안, 데이터 검증, 캐싱, 로깅에 사용한다.
프록시 서버는 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 말한다.
5. 어댑터(adaptor) 패턴 or 래퍼 클래스
어떤 기능의 구현 코드에 대한 바람직한 추상화를 제공하면서 그 기능의 사용자와 구현 코드를 연결해주는 역할을 한다. 표준 라이브러리 어댑터 패턴을 이용한 stack이나 queue와 같은 컨테이너를 deque이나 list와 같은 다른 컨테이너로 구현한다.
어탭터의 목적은 내부 기능에 좀 더 적합한 인터페이스를 제공하는 데 있으므로 구현한 어댑터는 사용하기 쉽고 다양한 용도에 잘 맞아야 한다.
Reference.
1. 면접을 위한 cs 전공지식 노트 (길벗, 주홍철)
2. 전문가를 위한 C++ (한빛미디어, 마크 그레고리 저자/ 남기혁 번역)
'👨🏻💻 programming > ◽ c, c++' 카테고리의 다른 글
[C++] Map의 Key로 Class/Struct 넣기 (2) | 2023.08.11 |
---|---|
(c++) 인코딩(Encoding),유니코드(Unicode), 로케일, 패싯 (0) | 2022.09.07 |
(c++17) decltype, 로 스트링 리터럴, static, const, extern, mutable, constexpr, 타입 앨리어스, 스코프, 레퍼런스, 어트리튜트 (4) | 2022.08.11 |
(c++17) 전처리 지시자, if-switch 이니셜라이저, __func__, 구조적 바인드 (0) | 2022.08.04 |
[C++] 멀티 프로그래밍(전문가를 위한 C++ , Chapter 27 정리 ) (0) | 2022.05.16 |
안 하는 것 보다 낫겠지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!