팩토리 메서드 수정2탄 (1탄에서 취소선을 사용한 이유가 들어가 있음)

2024. 9. 30. 16:45카테고리 없음

팩토리 메서드 2탄

시도

Player에서 직업을 하위클래스로 두지말고 생성자에 넣어서 사용하는 방식으로 작성을 했다.

Creature클래스

public enum CreatureType    
{
    Player,
    Monster
}

public static Creature CreatureFactory(CreatureType creaturetype, Player.Type playertype, Monster.Type monstertype,  string name)      //타입과 사용자 이름 받기
{
    switch (creaturetype)
    {
        case CreatureType.Player:
            return new Player(playertype, name);
        case CreatureType.Monster:
            return new Monster(monstertype);
    }
    throw new System.NotSupportedException($"{creaturetype} 이라는 타입은 존재하지 않습니다");
}

 

Player 클래스

//직업을 enum타입으로 만들어서 생성자에서 직업을 선택할때 enum에 정의된 이름으로 접근해서 사용할 수 있게끔 했다.

public enum Type
{
    Knight,
    Archor,
    Mage
}

 

//생성자로 직업 정보 넣기

public Player(Type type, string name)
{
    switch (type)
    {
        case Type.Knight:
            _Lv = 1;
            _Name = name;
            _Job = "Knight";
            _Atk = 5;
            _Def = 10;
            _Critical = 0.1f;
            _Avoid = 0.1f;
            _Hp = 100;
            _Exp = 0;
            break;
        case Type.Archor:
            _Lv = 1;
            _Name = name;
            _Job = "Archor";
            _Atk = 8;
            _Def = 7;
            _Critical = 0.25f;
            _Avoid = 0.2f;
            _Hp = 80;
            _Exp = 0;
            break;
        case Type.Mage:
            _Lv = 1;
            //_Name = name;
            _Job = "Mage";
            _Atk = 10;
            _Def = 5;
            _Critical = 0.15f;
            _Avoid = 0.8f;
            _Hp = 70;
            _Exp = 0;
            break;
        default:
            Console.WriteLine($"{type} 이라는 직업은 없습니다.");
            break;
    }
}

위 코드 설명

위와 같이 코드를 짠 이유는 직업을 만들때마다 하위클래스가 너무많이 생기니깐 그거를 방지하기 위해서 생성자에서 정보를 넣을 수 있게끔 만들어 봤다. 하지만 이렇게만 팩토리 메서드가 굳이 필요가 없다고 하신다.  왜???!!!!

(그리고 Creature클래스에서 팩토리 메서드라고 부리는 메서드에서 매개변수로 PlayerType과 MonsterType을 둘다 사용하면 안되기 때문에 이 문제도 있다.)

팩토리 메서드 사용 안해도 되는 이유

1. Player의 직업들이 생성자로 다 들어가 있어서

팩토리 메서드는 Player에서 상속받는 클래스의 객체를 생성해 주는거지 Player에서 생성되는 정보를 가지고 객체를 생성하는게 아니다.

2. 위와 같이 작성하면 Creature부분의 팩토리 메서드를 지우고 Player객체를 생성하면 간단하게 만들 수 있기 때문

3. Creature부분에서 팩토리 메서드라고 불리는 함수를 보면 안에 Player와 Monster가 있는데 이렇게 두개의 타입이 들어가있으면 안된다. 그래서 이렇게 사용할거면 Player하나만을 사용하고 Monster는 따로 부모클래스를 하나 생성해서 사용을 해야한다.

 

위와 같은 이유때문에 이렇게 팩토리 메서드를 짜면 안된다.