엔지니어 동행하기

Singleton Pattern, Macro함수 & static으로 구현 본문

Design Pattern/생성 패턴

Singleton Pattern, Macro함수 & static으로 구현

엔지니어 설리번 2022. 7. 17. 14:55
반응형
Singleton Pattern은  생성 패턴 중 하나로, Process가 실행 중에 오직 하나의 Object만 생성되도록 강제하는 Design Pattern입니다. 이에 대해 자세히 알아보도록 하겠습니다.

 

Singleton Pattern

해당 Pattern을 갖는 Class를 사용해서 여러 개의 Object를 만들어도 메모리 상에는 하나의 Object만 가리키게 됩니다. 싱글톤 패턴을 사용하는 경우는 다음과 같습니다.

- 하나의 Object가 Resource를 많이 차지하는 경우

- 외부 네트워크와 연결하는 Object가 단 한 개만 있어야 하는 경우

 

예제 코드: Macro 함수로 구현

#define DECLARE_SINGLETON(classname)                                      \
 public:                                                                  \
  static classname *Instance(bool create_if_needed = true) {              \
    static classname *instance = nullptr;                                 \
    if (!instance && create_if_needed) {                                  \
      static std::once_flag flag;                                         \
      std::call_once(flag,                                                \
                     [&] { instance = new (std::nothrow) classname(); }); \
    }                                                                     \
    return instance;                                                      \
  }                                                                       \
                                                                          \
  static void CleanUp() {                                                 \
    auto instance = Instance(false);                                      \
    if (instance != nullptr) {                                            \
      CallShutdown(instance);                                             \
    }                                                                     \
  }                                                                       \
                                                                          \
 private:                                                                 \
  classname();                                                            \
  DISALLOW_COPY_AND_ASSIGN(classname)

이 코드를 이해하기 위해서는 다음 내용을 알아야 합니다.

- Macro 함수에서 public, private keyword 사용방법

- Macro함수의 Input parameter로 classname을 받아 사용하는 방법

- static keyword

- std::once_flag

- std::call_once & Lambda function

 

예제 코드: HDMap Input, Transform Buffer, Sensor Data Manager

Apollo Auto에서는 매크로함수 DECLARE_SINGLETON을 구현하고, Class를 정의할 때 가장 마지막 부분에 class name을 매크로 함수의 input parameter로 넘김으로써 싱글톤을 구현하고 있습니다. 전체 Process에서 하나의 Object만 만들어지면 되는 경우는 HDMap Input, Transform Buffer, Sensor Data Manager 등이 있고, 그중 하나를 보여드리면 다음과 같습니다. 

class HDMapInput {
 public:
  // thread safe
  bool Init();
  bool Reset();
  bool GetRoiHDMapStruct(const base::PointD& pointd, const double distance,
                         std::shared_ptr<base::HdmapStruct> hdmap_struct_prt);
  bool GetNearestLaneDirection(const base::PointD& pointd,
                               Eigen::Vector3d* lane_direction);
  bool GetSignals(const Eigen::Vector3d& pointd, double forward_distance,
                  std::vector<apollo::hdmap::Signal>* signals);

 private:
  // member functions
  // member variables

  DECLARE_SINGLETON(HDMapInput)
};

https://github.com/ApolloAuto/apollo/blob/master/cyber/common/macros.h

 

GitHub - ApolloAuto/apollo: An open autonomous driving platform

An open autonomous driving platform. Contribute to ApolloAuto/apollo development by creating an account on GitHub.

github.com

https://github.com/ApolloAuto/apollo/blob/master/modules/perception/map/hdmap/hdmap_input.h

 

GitHub - ApolloAuto/apollo: An open autonomous driving platform

An open autonomous driving platform. Contribute to ApolloAuto/apollo development by creating an account on GitHub.

github.com

반응형
Comments