상세 컨텐츠

본문 제목

모노스테이트 패턴 Monostate pattern

컴퓨터 언어/디자인패턴

by 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
반응형

'컴퓨터 언어 > 디자인패턴' 카테고리의 다른 글

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

관련글 더보기

댓글 영역