[C++] 2.4 공장 패턴 Factory Pattern

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 게임 만들기 연습 문제 패키지 강의를 듣고 정리한 필기입니다.😀
🌜 공부에 사용된 홍정모 교수님의 코드들 보러가기
🌜 [홍정모의 게임 만들기 연습 문제 패키지] 강의 들으러 가기!


Chapter 2. 객체 지향으로 가는 길 : 공장 패턴

다형성과 관련이 깊다.

🔔 공장 패턴의 아이디어

#include "Triangle.h"
#include "Circle.h"
#include "Box.h"

std::vector<GeometricObject *> my_objs;

my_objs.push_back(new Triangle(Colors::gold, vec2{ -0.5f, 0.2f }, 0.1f)); 
my_objs.push_back(new Circle(Colors::olive, vec2{ 0.1f, 0.1f }, 0.1f)); 
my_objs.push_back(new Box(Colors::black, vec2{ 0.5f, 0.5f }, 0.2f, 0.1f)); 
  • 저렇게 무더기로 #include 할 필요가 없기 위해 자식 타입별로 리턴 받는 함수를 GeometricObject.h 에 만들어서 #include는 GeometricObject.h 하나만 할 수 있도록 하면 어떨까


🔔 공장 패턴이란?

  • 공장에서 다양한 객체를 찍어내듯이, ‘팩토리’가 되는 클래스 한개가 모든 타입을 처리하도록 설계하는 패턴
    • Triangle , Circle , Box , Star 이 객체들의 부모 클래스인 GeometricObject 클래스가 이 모든 4개의 자식 타입을 처리 할 수 있도록 설계하기
      • include 여러개 할 필요없이 딱 GeometricObject 헤더파일 하나만 include하면 된다.

📜GeometricObject.h

#pragma once

#include "Game2D.h"

namespace jm
{
	class GeometricObject
	{
	public:
		vec2 pos;
		RGB  color;

		//virtual ~GeometricObject()
		//{}    스마트 포인터 shared_ptr을 쓴다면 필요 x

		void init(const RGB & _color, const vec2 & _pos)
		{
			color = _color;
			pos = _pos;
		}

		virtual void drawGeometry() const = 0;

		void draw()
		{
			beginTransformation();
			{
				translate(pos);
				drawGeometry();
			}
			endTransformation();
		}
		
		// 선언만.  구현은 GeometircObject.cpp 에서 
		static GeometricObject * makeTriangle(const RGB & _color, const vec2 & _pos, const float & _size);
		static GeometricObject * makeCircle(const RGB & _color, const vec2 & _pos, const float & _size);
		static GeometricObject * makeBox(const RGB & _color, const vec2 & _pos, const float & _width, const float &_height);
		static GeometricObject * makeStar(const RGB & _color, const vec2 & _pos, const float & _os, const float & _is);
	};
}

📜GeometricObject.cpp

정작 여기선 모든 자식 타입을 처리하기 위해 #include를 무더기로 해주고 있다.

#include "GeometricObject.h"

#include "Triangle.h"   
#include "Circle.h"    
#include "Box.h"      
#include "Star.h"  

namespace jm
{
	/* 각 자식 객체를 생성하고 초기화하고 포인터를 리턴하는 함수*/

	GeometricObject * GeometricObject::makeTriangle(const RGB & _color, const vec2 & _pos, const float & _size)
	{
		return new Triangle(_color, _pos, _size);
	}
	
	GeometricObject * GeometricObject::makeCircle(const RGB & _color, const vec2 & _pos, const float & _size)
	{
		return new Circle(_color, _pos, _size);
	}
	
	GeometricObject * GeometricObject::makeBox(const RGB & _color, const vec2 & _pos, const float & _width, const float & _height)
	{
		return new Box(_color, _pos, _width, _height);
	}

	GeometricObject * GeometricObject::makeStar(const RGB & _color, const vec2 & _pos, const float & _os, const float & _is)
	{
		return new Star(_color, _pos, _os, _is);
	}
}

📜main

  • 이제 #include “GeometricObject.h” 하나만 하면 된다.
    • 이거 하나만 해도 모든 자식들에 접근할 수 있다.
    • 📜GeometricObject.h 에서 자식 종류별로 처리 하는 함수들을 각각 다 만들어놨기 때문에.
#include "GeometricObject.h"

/* GeometriObject의 각 자식 타입들을 생성하고 초기화 해주는 함수 호출 */
my_objs.push_back(GeometricObject::makeTriangle(Colors::gold, vec2{ -0.5f, 0.2f }, 0.1f));
my_objs.push_back(GeometricObject::makeCircle(Colors::olive, vec2{ 0.1f, 0.1f }, 0.1f));
my_objs.push_back(GeometricObject::makeBox(Colors::black, vec2{ 0.5f, 0.5f }, 0.2f, 0.1f));
my_objs.push_back(GeometricObject::makeStar(Colors::gold, vec2{ 0.0f, -0.5f }, 0.25f, 0.15f));


🔔게임 구현시에는

  • 게임에서는 객체 생성에 대해 이런식의 하드 코딩은 하지 않는 편이다.
  • 게임 제작 에서는
    1. 스크립트 파일로 객체들의 정보를 입력받거나
      • ex ) 탱크는 어디에 위치하고 등등
    2. 마우스로 클릭해서 객체 배치 등등
    3. 게임을 끄면 파일로 정보 저장


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기