Abstract Factory
2022. 2. 21. 00:00ㆍCSharp/Advance
반응형
구체적인 클래스를 지정하지 않고 관련 개체의 패밀리를 생성할 수 있는 생성 디자인 패턴
문제
MMORPG 게임에서 전사, 도적, 사냥꾼 이라는 직업이 존재 하는 상황이라고 가정하자.
각 직업은 또한 무기와 방어구를 갖고 있다.
전사
무기 : 대검
방어구 : 판금 갑옷
도적
무기 : 독이 묻은 단검
방어구 : 가죽 갑옷
암살자
무기 : 암살용 검
방어구 : 천 갑옷
만약 전사에게 대검이 아닌 단검을 쥐어 주거나 얇은 시미터를 주면 제역할을 하지 못할 것이고
도적에게 판금 갑옷을 방어구로 주면 너무느려서 아무것도 하지 못할 것이다.
또한 우리는 새로운 직업이 추가되었을때 기존 직업에 영향을 주게 하고 싶지 않을 것이다.
해결책
Abstract Factory 를 통해 제품군(직업)의 개별제품(무기,방어구)에 대한 인터페이스를 명시적으로 선언하자
그런 다음 제품의 모든 변형이 이러한 인터페이스를 따르도록 하자.
예를 위하여 단순히 정의 한것이므로 참고만 바랍니다.
무기에 대한 interface 정의 및 구현
public interface IWeapon
{
void GetDescription();
}
public class BigSword : IWeapon
{
public void GetDescription() => Console.WriteLine("BigSword");
}
public class PoisonDagger : IWeapon
{
public void GetDescription() => Console.WriteLine("Dagger");
}
public class DoubleDagger : IWeapon
{
public void GetDescription() => Console.WriteLine("DoubleDagger");
}
Armor 에 대한 interface 정의 및 구현
public interface IArmor
{
void GetDescription();
}
public class PlateArmor : IArmor
{
public void GetDescription() => Console.WriteLine("PlateArmor");
}
public class LeatherArmor : IArmor
{
public void GetDescription() => Console.WriteLine("LeatherArmor");
}
public class ClothArmor : IArmor
{
public void GetDescription() => Console.WriteLine("ClothArmor");
}
각 Factory 에 대한 interface 정의 및 구현
public interface IUnitFactory
{
void CreateWeapon();
void CreateArmor();
}
public class WarriorFactory : IUnitFactory
{
public void CreateArmor()=> new PlateArmor().GetDescription();
public void CreateWeapon() => new BigSword().GetDescription();
}
public class RogueFactory : IUnitFactory
{
public void CreateArmor() => new LeatherArmor().GetDescription();
public void CreateWeapon() => new PoisonDagger().GetDescription();
}
public class AssassinFactory : IUnitFactory
{
public void CreateArmor() => new ClothArmor().GetDescription();
public void CreateWeapon() => new DoubleDagger().GetDescription();
}
사용예
List<IUnitFactory> list = new List<IUnitFactory>();
list.Add(new WarriorFactory());
list.Add(new RogueFactory());
list.Add(new AssassinFactory());
list.ForEach(u =>
{
u.CreateWeapon();
u.CreateArmor();
});
// output
BigSword
PlateArmor
Dagger
LeatherArmor
DoubleDagger
ClothArmor
위와 같이 다형성을 이용하여 같은 factory interface 를 통해 각각의 직업들의 무기, 방어구를 처리가능하다.
새로운 직업을 추가 하게 될때 이전 직업들은 서로 격리 되어 있으며 다른 객체에 영향을 주지 않는다.
관련영상
반응형
'CSharp > Advance' 카테고리의 다른 글
Factory Method (0) | 2022.02.23 |
---|---|
Builder (0) | 2022.02.22 |
Parallel Programming (PLINQ Optimizing and Parallel Class) (0) | 2022.02.18 |
Parallel Programming (PLINQ) (0) | 2022.02.17 |
Parallel Programming (TPL Dataflow) (0) | 2022.02.16 |