ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [기술 면접 공부] Factory Pattern (팩토리 패턴)
    기술 면접 공부 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를 상속하는 클래스를 생성하기만 하면 된다.

Designed by Tistory.