'디자인 패턴! 이렇게 활용한다' 를 읽고...
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:
1
2
3
4
5
6
7
8
Marin: Move
Marin: Attack
Medic: Move
Medic: Attack
Zealot: Move
Zealot: Attack
Dragoon: Move
Dragoon: Attack


+ Recent posts