본문 바로가기

PROGRAMMING/Design Pattern

[GoF] 팩토리 메서드 (Factory Method) 패턴

팩토리 메서드 (Factory Method) 패턴 생성 패턴

클래스의 상속을 통해 하위 객체의 생성을 정의합니다.


 


객체는 단일의 책임을 부과하기 위해 생성될 때나 사용 중일 때 필요에 따라 하위 객체를 추가적으로 생성하고 할당하여 객체의 기능을 확장할 수도 있다. 하지만, 클래스의 상속을 거친 하위 클래스는 속성이 다른 객체를 요구할 수도 있는데, 이 기능을 하나의 상위 클래스 내에서 정의하려면 switch-case 문과 같은 조건문을 통해 생성해야 할 객체의 속성을 정의해야 한다. 그러나, 이것은 끊임없이 확장하는 클래스 상속 구조에선 적절하지 않다. 하위 클래스의 속성을 확장해야 할 경우 생성을 구현하는 조건문을 직접 수정해야 하기 때문이다.

그래서 팩토리 메서드 패턴은, 상위 클래스에서 생성해야 할 객체를 명시하지 않고, 클래스의 상속을 통해 하위 클래스에서 생성해야 할 객체를 결정하게 된다. 상위 클래스는 new 연산자를 통한 객체의 직접적인 생성 대신에 생성된 객체를 반환하는 가상 함수를 정의하며, 이를 통해 하위 클래스에서 new 연산자를 통해 생성된 객체를 할당 받아 사용하게 된다.

팩토리 메서드 패턴을 통해 하위 객체의 생성을 하위 클래스에게 위임하게 되면, 상위 클래스를 수정하지 않고도 상속을 통해 하위 클래스에게 하위 객체에 대한 확장을 지원하게 되어 개방-폐쇄 원칙을 준수할 수 있고, 상위 클래스는 하위 클래스로부터 하위 객체의 생성에 대한 구체적인 내용을 숨길 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class PatternFactoryMethod
{
    public abstract class Creator
    {
        private IProduct _product;
 
        public void Operation()
        {
            if (_product == null)
            {
                _product = FactoryMethod();
            }
 
            _product.Operation();
        }
 
        protected abstract IProduct FactoryMethod();
    }
 
    public class CreatorA : Creator
    {
        protected override IProduct FactoryMethod()
        {
            return new ProductA();
        }
    }
 
    public interface IProduct
    {
        void Operation();
    }
 
    public class ProductA : IProduct
    {
        public void Operation()
        {
            Console.WriteLine("Operate ProductA");
        }
    }
 
    public static void Main(string[] args)
    {
        Creator creator = new CreatorA();
 
        creator.Operation();
    }
}
cs

1
2
Operate ProductA
Press any key to continue . . .
cs