# 팩토리 패턴

---

팩토리 패턴은 서로 바꿔서 사용할 수 있는 관련 클래스가 여러개 있는 경우에, 미리 사용할 클래스를 지정하고 싶지 않을때 사용한다. 예를 들어 게임 캐릭터 생성, 노션 에디터의 블록 타입 등에 사용할 수 있다.

```
// Base class for all characters
class Character {
  constructor(name, strength, defense) {
    this.name = name;
    this.strength = strength;
    this.defense = defense;
  }
  
  attack() {
    console.log(`${this.name} attacks for ${this.strength} damage.`);
  }
  
  defend() {
    console.log(`${this.name} defends with ${this.defense} strength.`);
  }
}

// Factory class for creating characters
class CharacterFactory {
  createCharacter(type, name) {
    switch(type) {
      case 'warrior':
        return new Warrior(name);
      case 'mage':
        return new Mage(name);
      case 'rogue':
        return new Rogue(name);
      default:
        throw new Error(`Unsupported character type: ${type}`);
    }
  }
}

// Concrete classes for each type of character
class Warrior extends Character {
  constructor(name) {
    super(name, 10, 5);
  }
}

class Mage extends Character {
  constructor(name) {
    super(name, 5, 10);
  }
}

class Rogue extends Character {
  constructor(name) {
    super(name, 8, 8);
  }
}

// Usage example
const factory = new CharacterFactory();

const player1 = factory.createCharacter('warrior', 'John');
const player2 = factory.createCharacter('mage', 'Jane');
const player3 = factory.createCharacter('rogue', 'Bob');

player1.attack();
player2.defend();
player3.attack();
```

For the site tree, see the [root Markdown](https://slashpage.com/develop.md).
