기술 면접 공부

[기술 면접 공부] Factory Pattern (팩토리 패턴)

EQ1 2021. 1. 7. 11:47

정의

객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 파생 클래스에서 결정

 

장점

객체의 생성을 한 군데에서 관리할 수 있다.

동일한 인터페이스를 준수하는 클래스들을 생성하기 때문에 외부 코드 수정이 거의 없다.

 

구조

  Product Creator
  Product Creator
Concrete ConcreteProduct ConcreteCreator

Product : 팩토리 메서드로 생성될 공용 객체. 주로 추상 클래스이거나 인터페이스

ConcreteProduct : Product를 상속받는 구체적인 객체

Creator : Product를 구현하는 메서드가 존재. 주로 추상 클래스이거나 인터페이스

ConcreteCreator : Creator를 상속받아서 각각의 ConcreteProduct를 구현

 

예제 코드

abstract class Enemy
{
    protected EnemyType type;
    protected string name;
    protected int hp;
    protected int exp;
        
    protected void Attack() { }
}

Product에 해당하는 Enemy 추상 클래스

 

class Zombie : Enemy
{
    public Zombie()
    {
        type = EnemyType.Zombie;
        name = "Zombie";
        hp = 100;
        exp = 50;
        Console.WriteLine("{0} : 출현!!", this.name);
    }
}
class Slime : Enemy
{
    public Slime()
    {
        type = EnemyType.Slime;
        name = "Slime";
        hp = 200;
        exp = 15;
        Console.WriteLine("{0} : 출현!!", this.name);
    }
}

ConcreteProduct에 해당하는 Zombie와 Slime 클래스. Enemy를 상속받는다.

 

abstract class EnemyGenerator
{
    private List<Enemy> _enemy = new List<Enemy>();
    public EnemyGenerator() { }
    public List<Enemy> Enemys { get { return _enemy; } }
    public abstract void CreateEnemys(); // Factory Method
}

Creator에 해당하는 EnemyGenerator 추상 클래스. 기본적인 property들을 가지면서 실제 enemy를 생성하는 CreateEnemys() 함수는 파생 클래스로 위임했다.

 

class PatternAGenerator : EnemyGenerator
{
    public override void CreateEnemys()
    {
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
    }
}
class PatternBGenerator : EnemyGenerator
{
    public override void CreateEnemys()
    {
        Enemys.Add(new Slime());
        Enemys.Add(new Slime());
        Enemys.Add(new Slime());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
        Enemys.Add(new Zombie());
    }
}

ConcreteCreator에 해당하는 PatterAGenerator와 PatterBGenerator 클래스. EnemyGenerator 클래스를 상속받아서 실제로 생성하는 부분을 구현한다. 새로운 패턴을 만들고자 한다면 EnemyGenerator를 상속하는 클래스를 생성하기만 하면 된다.