모노스테이트는 싱글턴 패턴의 변형이다.
모노스테이트는 겉보기에는 일반 클래스와 동일하나 동작은 싱글턴처럼 한다.
#ifndef _monostate_h_
#define _monostate_h_
class Printer
{
private:
static int id;
public:
int get_id() const { return id; }
void set_id(int value) { id = value; }
};
#endif // _monostate_h_
언뜻 보기에는 보통 클래스처럼 보이지만 static 데이터를 이용하여 get/set 멤버가 구현되어 있다.
무언가 괜찮은 트릭으로 보이지만 문제가 있다. 사용자는 일반 클래스인 것으로 알고 Printer의 인스턴스를 만들지만 실제로는 모든 인스턴스가 같은 데이터를 바라본다. 이사실은 사용자가 알 수 없다. 사용자는 아무런 의심 없이 두 개의 Printer 인스턴스를 만들어 서로 다른 id를 부여하지만 두 Printer의 id 같다.
멤버 변수가 static 멤버를 사용하기 때문에 실제 객체가 인스턴스화되어 사용되는지와 관계없이 항상 메모리를 차지한다. 단점으로는 클래스의 필드를 항상 get/set 멤버 함수를 통하여 접근되는 것으로 가정하지만, 만약 노출되는 필드가 있다면 리팩터링 작업에서 재앙이다.
C++ 업무를 하면서 싱글턴패턴은 DB or Hardware 관련 API 최초 실행 시 초기화하는 시점에만 사용하고 그 외에는 사용하지 않았다. 멀티 스레드 환경에서 다수의 스레드가 접근 시 변경되는 값이나 할당으로 인하여 지옥을 경험 후 지양하게 됐다. 모노 스테이트라는 패턴이 있다는 것은 처음 알았다. 실제 개발하는 프로그램 내에서 사용할 예시를 찾아보고 이해하는 것이 좋을 거 같다.
#pragma once
#include <string>
class Cat
{
private:
static std::string fish;
public:
std::string get_id() const
{
return fish;
}
void set_id(std::string &fish)
{
this->fish = fish;
}
};
고양이 class 나타냈다. 여기서 fish 스트링 변수는 공유가 되겠지?
그러면 여러 명의 고양이 인스턴스를 생성했을 때 고양이들은 공유되는 fish 변수 하나만 가질 수 있다. 고양이 객체가 매우 많다고 하자. fish 자원은 하나인데 여러 고양이들이 물고 있다고 생각해보자?
RAII idiom (0) | 2021.05.07 |
---|---|
핌플 이디엄 Pimpl idiom (0) | 2021.05.07 |
싱글턴 패턴 SingleTon pattern (0) | 2021.05.07 |
빌더 패턴 사용 이유 (0) | 2021.05.07 |
빌더 패턴 Build pattern (0) | 2021.05.07 |
댓글 영역