Programming/Design Pattern

[C# 디자인패턴] 제3강 팩토리메소드패턴

Hyunseok Oh 2015. 7. 18. 12:54





예제코드

using System;
using System.Collections.Generic;

namespace FactoryMethodEx
{
    public enum EnemyType
    {
        Zombie,
        Slime
    }

    abstract class Enemy
    {
        protected EnemyType type;
        protected string name;
        protected int hp;
        protected int exp;

        protected void Attack() { }        
    }

    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);
        }
    }

    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
    }

    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());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            EnemyGenerator[] enemyGenerators = new EnemyGenerator[2];
            enemyGenerators[0] = new PatternAGenerator();
            enemyGenerators[1] = new PatternBGenerator();

            enemyGenerators[1].CreateEnemys();

            Console.ReadKey();
        }
    }
}