본문 바로가기

PROGRAMMING/Design Pattern

[GoF] 추상 팩토리 (Abstract Factory) 패턴

추상 팩토리 (Abstract Factory) 패턴 생성 패턴

관련성이 있는 여러 객체로 이루어진 구조의 생성을 정의합니다.


 


클라이언트는 상황에 따라 다른 구조를 생성해야 할 때가 있다. 그렇다면, enumeration이나 string을 인자로 받아 switch-case 문으로 하여금 생성할 구조의 속성을 지정할 수 있으나, 생성해야 할 구조의 가짓수가 많아질수록 생성에 대한 부가적인 기능을 추가하기 위해 함수를 수정해야 함으로 유연성이 떨어질 수 있다.

그래서 추상 팩토리 패턴은 구조의 생성을 수행하는 팩토리 클래스를 정의하여 클라이언트가 팩토리 클래스의 인터페이스를 통해 구조를 생성할 수 있게 한다. 추상 팩토리 구조의 생성에 관한 구체적인 내용이 팩토리 클래스에서 구현되기에 구조의 생성에 대한 유연한 확장을 지원하고 클라이언트는 어떤 팩토리 객체를 사용하냐에 따라 다른 구조를 클라이언트가 세부 클래스를 이해할 필요 없이 제공받을 수 있다.

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
48
49
50
51
52
53
54
55
56
57
58
59
60
public class PatternAbstractFactory
{
    public interface IAbstractFactory
    {
        IProduct CreateProduct();
    }
 
    public class AbstractFactoryA : IAbstractFactory
    {
        public IProduct CreateProduct()
        {
            return new ProductA();
        }
    }
    
    public class AbstractFactoryB : IAbstractFactory
    {
        public IProduct CreateProduct()
        {
            return new ProductB();
        }
    }
 
    public interface IProduct
    {
        void Operation();
    }
 
    public class ProductA : IProduct
    {
        public void Operation()
        {
            Console.WriteLine("Operating ProductA");
        }
    }
 
    public class ProductB : IProduct
    {
        public void Operation()
        {
            Console.WriteLine("Operating ProductB");
        }
    }
 
    public static void Main(string[] args)
    {
        IAbstractFactory abstractFactory;
        IProduct product;
 
        abstractFactory = new AbstractFactoryA();
        product = abstractFactory.CreateProduct();
 
        product.Operation();
 
        abstractFactory = new AbstractFactoryB();
        product = abstractFactory.CreateProduct();
 
        product.Operation();
    }
}
cs

1
2
3
Operating ProductA
Operating ProductB
Press any key to continue . . .
cs