1. 팩토리 메서드 패턴이란?
- 생성하는 공장은 단 한 개만 존재, 하지만 자식 클래스에 의해 여러 방식들로 구현 가능!
- 객체를 생성하는 방법을 해당 클래스를 상속 받은 클래스에서 명시하도록 하는 패턴
- 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생설될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴
- 클래스에서 객체를 생성하기 위해 일반적으로 생성자를 만들지만 팩토리 메서드 패턴을 사용하면 이런 행위를 위임받아서 실행함.
2. 팩토리 메서드 패턴을 사용하는 경우
1) 코드가 높은 수준의 유연성을 제공해야 할 경우
2) 프로그램의 뼈대를 만들 경우
3) 추후 확장이 필요할 수 있는 경우
3. 팩토리 메서드 패턴의 장점
1) 유지보수 용이 : 객체의 생성을 한 군데에서 관리할 수 있고, 동일한 인터페이스 구현으로 새로운 객체가 추가되더라도 소스의 수정이 거의 없다.
2) 다형성 : 부모인 팩토리 클래스 입장에서는 자식 클래스가 어떻게 생성하는지 알 필요 없이 그냥 생성만 해주면 된다.
3) 협업성 : 구조가 잡힌 상태에서 여러 사람이 각자 파생 클래스를 구현하게 되어 협업이 가능하다.
4) 유연성 : 기능이 바뀌거나 새로운 기능을 추가할 때 해당 객체만 변경하면 되기 때문에 객체 생성 코드를 유연하게 변경할 수 있다.
5) 중복제거 : 중복 기능을 묶어 다른 클래스로 생성하여 구조를 잡을 수 있다.
4. 팩토리 메서드 패턴의 단점
1) 복잡성 : 코드가 복잡해질 수 있다.
2) 가독성 : 코드 가독성에 영향을 줄 수 있음.
3) 유지보수 비용 : 유지보수 비용이 높아질 수 있음.
5. 코드 구현
<구조>
- Product : 팩토리 메서드로 생성될 공용 객체 (주로 추상 클래스 또는 인터페이스)
- Creator : Product가 구현하는 메서드가 존재 (주로 추상 클래스 또는 인터페이스)
- ConcreteProduct : Product를 상속받는 객체
- ConcreteCreator : Creator를 상속받는 객체
Product | Creator | |
부모 | Product | Creator |
자식 | ConcreteProduct | ConcreteCreator |
1) Product
// Product - 생성할 객체의 공통적인 특성을 지닌 추상 클래스
abstract class Animal
{
protected string name;
}
2) Creator
// Creator - Poduct 타입의 객체를 반환하는 메서드를 선언하는 추상 클래스
abstract class Creator
{
private List<Animal> _Animals = new List<Animal>();
public Creator() {}
public List<Animal> Animals
{
get => _Animals;
}
}
3) ConcreteProduct
// ConcreteProduct - Product를 상속받아서 구현
class Dog : Animal
{
public Dog()
{
name = "Dog";
Console.WriteLine(this.name);
}
}
class Cat : Animal
{
public Cat()
{
name = "Cat";
Console.WriteLine(this.name);
}
}
4) ConcreteCreator
// ConcreteCreator - Creator를 상속받아 오버라이딩
class PatternA : Creator
{
public override void CreateAnimals()
{
Animals.Add(new Dog()):
Animals.Add(new Cat()):
}
}
class PatternB : Creator
{
public override void CreateAnimals()
{
Animals.Add(new Cat()):
Animals.Add(new Dog()):
}
}
<참고 사이트>