-
[기술 면접 공부] 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를 상속하는 클래스를 생성하기만 하면 된다.
'기술 면접 공부' 카테고리의 다른 글
[기술 면접 공부] C# 코루틴 (Coroutine) (1) 2021.01.07 [기술 면접 공부] C#의 메모리 구조 (0) 2021.01.07 [기술 면접 공부] C#의 메모리 관리 (0) 2021.01.07 [기술 면접 공부] 싱글톤 패턴 (0) 2021.01.06 [기술 면접 공부] 추상 클래스, abstract (0) 2021.01.06