이것 역시 생성 패턴 이다.
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 |