본문 바로가기
Programming/프로그래밍 이론

[디자인 패턴] 추상 팩토리 패턴 (Abstract factory pattern)

by SpiralMoon 2019. 2. 14.
반응형

 주제 : 추상 팩토리 패턴 (Abstract factory pattern).


생성 패턴의 하나.


비슷한 속성의 제품(객체)들을 인터페이스로 규격화된 공정(팩토리)에서 일관된 방식으로 생성하고, 생성된 제품끼리는 쉽게 교체될 수 있도록 고안한 패턴이다.


▶  구조



추상 팩토리 패턴의 구조는 크게 4가지로 분류된다.

첫 번째, 추상 팩토리 인터페이스(추상클래스도 가능) : 추상 제품을 생산하는 인터페이스 제공

▷ 두 번째, 구현 팩토리 클래스 : 구현된 제품을 생산하는 방법 구현

▷ 세 번째, 추상 제품 인터페이스(추상클래스도 가능) : 제품에 대한 추상적 인터페이스 제공

▷ 네 번째, 구현 제품 클래스 : 팩토리가 생성할 구체적인 제품


▶  예시


기타(Guitar) 공장에서 통기타, 일렉기타 등 여러 종류의 기타를 만든다고 쳤을 때 아래 예시처럼 표현할 수 있다.

아래 예시는 C#을 기반으로 작성하였다.


// 기타의 몸통을 뜻하는 추상 제품 인터페이스
public interface IBody
{
    ...
}

// 기타의 현을 뜻하는 추상 제품 인터페이스
public interface IString
{
    ...
}

IBody, IString은 기타를 만들기 위해 필요한 부품을 인터페이스로 표현한 것이다. (추상 제품 인터페이스)

public class AcousticBody : IBody
{
    ...
}

public class ElectricBody : IBody
{
    ...
}

public class AcousticString : IString
{
    ...
}

public class ElectricString : IString
{
    ...
}

IBody, IString을 상속하여 통기타와 일렉기타 각각의 제품 클래스를 선언해준다. (구현 제품 클래스)

여기까지 만들었으면 일단 팩토리에서 생산할 제품은 정의가 되었다. 그럼 이제 제품을 생산하는 팩토리를 정의해보자.

public interface IGuitarFactory
{
    IBody CreateBody();

    IString CreateString();
}

기타 부품을 생산하는 팩토리 인터페이스를 선언해준다. 팩토리 인터페이스에서는 여러 구현 팩토리 클래스에서 필수 공통적으로 재정의할 함수를 선언해야한다.


통기타를 만드는 공장이던지 일렉기타를 만드는 공장이던지, 어떤 종류의 기타던 몸통과 현이 필요하기 때문에 CreateBody와 CreateString 함수를 선언해주었다.


이렇게 되면, 구체적으로 어떤 제품을 생산할 지는 알 수 없지만, 어떤 속성의 제품을 생산할 지는 대략적으로 유추할 수 있다. (CreateBody를 통해 몸통을 생산하면 AcousticBody인지 ElectricBody인지는 알 수 없어도 IBody 타입이라는 것은 알 수 있다는 뜻)

// 통기타를 생산하는 내용을 정의한 구현 팩토리 클래스
public class AcousticGuitarFactory : IGuitarFactory
{
    public IBody CreateBody()
    {
         return new AcousticBody();
    }

    public IString CreateString()
    {
        return new AcousticString();
    }
}

// 일렉기타를 생산하는 내용을 정의한 구현 팩토리 클래스
public class ElectricGuitarFactory : IGuitarFactory
{
    public IBody CreateBody()
    {
         return new ElectricBody();
    }

    public IString CreateString()
    {
        return new ElectricString();
    }
}

팩토리 인터페이스를 상속하여 두 개의 구현 팩토리 클래스를 정의하였다.

각각 통기타와 일렉기타를 생산하는 것으로, 공통 인터페이스를 상속받지만 구체적인 내용은 커스텀 할 수 있다.


결론적으로 위의 예시에서는 어떤 팩토리를 통해 기타를 생산하던간에, 공통 타입인 IBody나 IString이 만들어진다는 것을 알면 된다.


▶  장점

구체적인 클래스를 사용자로부터 분리 : 사용자는 생산되는 인터페이스에 대해서만 숙지하고 있어도 됨.

비슷한 속성의 객체(같은 추상 제품을 상속받은 객체)들을 쉽게 대체하거나 교체할 수 있음.

▷ 객체 생성 과정에서의 일관성이 높아짐


▶  단점

▷ 수정 불편 : 새로운 제품 클래스를 추가하게 된다면, 기존 추상 팩토리를 확장하기가 쉽지 않다. 추상 팩토리를 상속하고 있는 모든 팩토리에도 새로운 제품에 대한 구현 방법이 수정되어야 하기 때문이다.

반응형

댓글