Design Patterns2011. 11. 15. 18:14

이것 역시 생성 패턴 이다.
Abstract Factory 과 다른 점은 Abstract Factory 패턴은 불의 정령, 물의 정령의 공격, 방어 에 관련한 행위 객체를 추상화 하여 생성한 것이고, Builder 패턴은 불의정령, 물의정령 객체를 만드는 부분을 추상화한 패턴인다.

쉽게 정리하면 Abstract Factory 사용할 각 객체를 세트로 생성하는 것이고, Builder 패턴은 하나의 완성된 객체를 만드는 과정을 추상화 한 것이다.


Director = MonsterDirector

Builder = IMonsterBuilder

ConcreateBuilder1 = FireMonsterBuilder
ConcreateBuilder1 = IceMonsterBuilder

Product = IMonster

struct IAttackType
{    
    virtual void Attack() = 0;
};

struct FireAttack : public IAttackType
{
    void Attack() { cout << "공격: 불을 뿜다 화이아~" << endl; };
};

struct IceAttack : public IAttackType
{
    void Attack() { cout << "공격: 얼음 화살 ㄱㄱ" << endl; };
};

/////////////

struct IDefensType
{
    virtual void Defenns() = 0;
};

struct AvoidDefens : public IDefensType
{
    void Defenns() { cout << "방어: 회피 하기" << endl << endl; };
};

struct IceShieldDefens : public IDefensType
{
    void Defenns() { cout << "방어: 얼음방패 막기" << endl << endl; };
};

/////////////

struct IMonster
{
    IAttackType* attack_type_;
    IDefensType* defens_type_;
};

struct FireMonster : public IMonster
{
    
};

struct IceMonster : public IMonster
{
 
};

/////////////

struct IMonsterBuilder
{
    virtual void BuildAttackType()  = 0;
    virtual void BuildDefensType()  = 0;
    IMonster* GetResult() {return monster_;};

    IMonster*   monster_;    
};

struct FireMonsterBuilder : public IMonsterBuilder
{
    FireMonsterBuilder() {monster_ = new FireMonster;};

    void BuildAttackType() { monster_->attack_type_ = new FireAttack; };
    void BuildDefensType() { monster_->defens_type_ = new AvoidDefens; };
};

struct IceMonsterBuilder : public IMonsterBuilder
{
    IceMonsterBuilder() {monster_ = new IceMonster;};

    void BuildAttackType() { monster_->attack_type_ = new IceAttack; };
    void BuildDefensType() { monster_->defens_type_ = new IceShieldDefens; };
};

/////////////

struct MonsterDirector
{    
    void Construct(IMonsterBuilder* monster_builder)
    {
        monster_builder->BuildDefensType();
        monster_builder->BuildAttackType();
    }
};

////////////

void main()
{   
    MonsterDirector monster_director;

    IMonsterBuilder* fire_monster_builder = new FireMonsterBuilder;
    IMonsterBuilder* ice_monster_builder = new IceMonsterBuilder;

    monster_director.Construct(fire_monster_builder);
    monster_director.Construct(ice_monster_builder);

    fire_monster_builder->GetResult()->attack_type_->Attack();
    fire_monster_builder->GetResult()->defens_type_->Defenns();

    ice_monster_builder->GetResult()->attack_type_->Attack();
    ice_monster_builder->GetResult()->defens_type_->Defenns();
}

공격: 불을 뿜다 화이아~
방어: 회피 하기

공격: 얼음 화살 ㄱㄱ
방어: 얼음방패 막기

'Design Patterns' 카테고리의 다른 글

Prototype  (0) 2011.12.05
Factory Method  (0) 2011.11.16
Abstract Factory  (0) 2011.11.15
객체지향 설계 원칙 5-5 ISP (Interface Segregation Principle)  (2) 2008.07.08
객체지향 설계 원칙 5-4 DIP (Dependency Inversion Principle)  (0) 2008.06.28
Posted by 상현달