컴퓨터 언어/디자인패턴

모노스테이트 패턴 Monostate pattern

cepiloth 2021. 5. 7. 11:36
728x90

 

모노스테이트는 싱글턴 패턴의 변형이다. 

모노스테이트는 겉보기에는 일반 클래스와 동일하나 동작은 싱글턴처럼 한다.

#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 멤버 함수를 통하여 접근되는 것으로 가정하지만, 만약 노출되는 필드가 있다면 리팩터링 작업에서 재앙이다.

 

Discussion

 C++ 업무를 하면서 싱글턴패턴은 DB or Hardware 관련 API 최초 실행 시 초기화하는 시점에만 사용하고 그 외에는 사용하지 않았다. 멀티 스레드 환경에서 다수의 스레드가 접근 시 변경되는 값이나 할당으로 인하여 지옥을 경험 후 지양하게 됐다. 모노 스테이트라는 패턴이 있다는 것은 처음 알았다. 실제 개발하는 프로그램 내에서 사용할 예시를 찾아보고 이해하는 것이 좋을 거 같다.

 

Cat Discussion

#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 자원은 하나인데 여러 고양이들이 물고 있다고 생각해보자?

공유되는 하나의 물고기 때문에 사이가 나빠질 것이다.

 

728x90
반응형