'디자인 패턴! 이렇게 활용한다' 를 읽고...
3장. 제품군별 객체 생성 문제
느낀점:
추상 팩토리 패턴은 옵저버 패턴 처럼 모듈화 하여 사용 하지는 못해서 약간 아쉽다.
이 밖에도 복제를 통해 객체를 생성하는 방법, 새로운 제품 종류의 추가 시 문제 해결 방법 등을 책에서 언급하고 있다.
실무 적용하기:
내가 일하는 임베디드 땅에는 왠지 적용하기 어려울 듯 하다.
윈도우, 리눅스, 안드로이드 각각에서 동작하는 코어 라이브러리를 추상화 하면 될 듯 하나,
왠지 다이가 더 커져서 유지보수가 어려워 질 듯 하다.
습작:
일반적인 추상 팩토리 패턴을 스타크래프트에 적용하여 보았다.
|
#include <iostream>
#include <string>
#include <boost/shared_ptr.hpp>
using namespace boost;
class CUnit
{
public:
virtual void Attack() = 0;
virtual void Move() = 0;
};
class Marin : public CUnit
{
public:
void Attack() { std::cout << "Marin: " << "Attack" << std::endl; }
void Move() { std::cout << "Marin: " << "Move" << std::endl; }
};
class Medic : public CUnit
{
public:
void Attack() { std::cout << "Medic: " << "Attack" << std::endl; }
void Move() { std::cout << "Medic: " << "Move" << std::endl; }
};
class Zealot : public CUnit
{
public:
void Attack() { std::cout << "Zealot: " << "Attack" << std::endl; }
void Move() { std::cout << "Zealot: " << "Move" << std::endl; }
};
class Dragoon : public CUnit
{
public:
void Attack() { std::cout << "Dragoon: " << "Attack" << std::endl; }
void Move() { std::cout << "Dragoon: " << "Move" << std::endl; }
};
class AbstractFactory
{
public:
virtual CUnit* CreateProductA() = 0;
virtual CUnit* CreateProductB() = 0;
};
class ProtosFactory : public AbstractFactory
{
public:
CUnit* CreateProductA() { return new Zealot(); }
CUnit* CreateProductB() { return new Dragoon(); }
};
class TerranFactory : public AbstractFactory
{
public:
CUnit* CreateProductA() { return new Marin(); }
CUnit* CreateProductB() { return new Medic(); }
};
int main()
{
{
AbstractFactory *factory = new TerranFactory();
CUnit *unitA = factory->CreateProductA();
CUnit *unitB = factory->CreateProductB();
unitA->Move();
unitA->Attack();
unitB->Move();
unitB->Attack();
}
{
AbstractFactory *factory = new ProtosFactory();
CUnit *unitA = factory->CreateProductA();
CUnit *unitB = factory->CreateProductB();
unitA->Move();
unitA->Attack();
unitB->Move();
unitB->Attack();
}
return 0;
}
|
Output:
|
Marin: Move
Marin: Attack
Medic: Move
Medic: Attack
Zealot: Move
Zealot: Attack
Dragoon: Move
Dragoon: Attack
|
|