Factory method 패턴

 

우선 위의 두가지 예제를 통해 Java에선 어떻게 Factory method를 구현했는지 보고 오시면 더 좋을 거 같습니다.

C언어에선 class라는 개념이 없기 때문에 어떻게 보면 이전 글들에서도 알게 모르게 계속해서 Factory method를 써왔습니다. 이번엔 다시 한번 Factory method를 살펴 보도록 하겠습니다.

 

이번 예제는 display를 구현해 보도록 하겠습니다. MCU 기반 Firmware에선 display하기 위한 데이터는 프레임 버퍼라 불리우는 메모리에 RGB color를 쌓아 놓고 한번에 뿌리는 형식으로 구현합니다.

 

우선 interface를 보도록 하겠습니다. 이전 글 Strategy 패턴(https://blog.naver.com/stm32mcu/222932436773) 의 open, close, write, read 구조로 구성이 되어있습니다.

 

typedef struct
{
	bool (*open)(void);
	bool (*close)(void);
	bool (*write)(uint8_t *buffer, uint16_t len);
	bool (*read)(uint32_t addr, uint8_t *buffer, uint16_t len);
}display_t;

extern display_t *setup_display(void);
 

typedef display_t라고 명명했지만 device_t로 명명해도 됩니다. 그런면에서 다양한 device에서도 사용이 가능해 집니다.

 

아래 setup_display 함수로 static this의 pointer를 넘겨주게 됩니다. 바로 이부분이 Factory method입니다. 직접 객체를 생성하는 것이 아니라 setup_display를 이용해 객체를 생성하여 리턴하는 부분입니다.

 

Factory method의 장점은 객체를 생성할 때 꼭 필요한 시퀀스를 강제로 밟을 수 있게 할 수 있다는 점입니다. 바로open 함수가 그 역할을 합니다. 단순히 포인터만 넘기는 것이 아닌 open을 해주는 것이지요. 더 필요한 설정이 있으면 setup_display에서 해주던가 open 함수 안에 넣으면 됩니다.

static bool open(void);
static bool close(void);
static bool write(uint8_t *buffer, uint16_t len);
static bool read(uint32_t addr, uint8_t *buffer, uint16_t len);

display_t this = 
{
	open,
	close,
	write,
	read
};

display_t *setup_display(void)
{
	this->open();
	return &this;
}

static bool open(void)
{
	//need to implement

	return true;
}

static bool close(void)
{
	//need to implement
	
	return true;
}

static bool write(uint8_t *buffer, uint16_t len)
{
	//need to implement
	
	return true;
}

static bool read(uint32_t addr, uint8_t *buffer, uint16_t len)
{
	//need to implement
	
	return true;
}
 

main.c를 보도록 하겠습니다. 아래와 같이 포인터를 얻어와 사용하면 됩니다. 실제 JAVA에서는 factory 추상 class가 있지만 C언어에서는 굳이 만들 필요는 없습니다.

 

C언어에선 객체를 구현하면 복잡해 질 수 있기 때문에 별도로 Factory를 구현하면 더욱 복잡해 질 수도 있습니다. simple하게 이정도 선에서 마무리하는게 좋을 거 같습니다.

static display_t *display;

void main(void)
{
	static uint8_t gui_data[320][240];
	display = setup_display();

	while(1)
	{
		display->write(gui_data, 320*240);
		delay_ms(1000);
	}

	display->close();
}
 

위와 같이 구현하면 display가 바뀌어도 main.c를 바꾸지 않고도 display를 쉽게 교체할 수 있습니다. Factory method는 코드를 쉽고 간단하게 구조화 할 수 있다는 장점이 있습니다.

 

오늘도 즐거운 C생활하세요.

'▶ C Application > 디자인 패턴' 카테고리의 다른 글

Adapter 패턴 - 2  (0) 2023.12.24
Adapter 패턴 - 1  (0) 2023.12.24
소프트웨어 Timer 만들기  (0) 2023.12.20
Template method 패턴  (0) 2023.12.17
Iterator 패턴 - Queue  (0) 2023.12.16