기술 면접 공부
[기술 면접 공부] 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를 상속하는 클래스를 생성하기만 하면 된다.