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

[디자인 패턴] 팩토리 메소드 패턴 (Factory method pattern)

by SpiralMoon 2019. 3. 20.
반응형

 주제 : 팩토리 메소드 패턴 (Factory method pattern).


생성 패턴의 하나.


팩토리라는 인터페이스를 정의하고 인스턴스화를 해내는 부분을 서브 클래스에 위임하는 패턴이다.


▶  관련 문서

추상 팩토리 패턴

위키피디아


 구조



팩토리 인터페이스를 정의하여 이를 서브 클래스가 상속받아 구현하는 형태이다. 서브 클래스는 Product 타입 객체를 생성하고 반환하는 createProduct 함수를 정의해야한다.


▶  예시


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

public interface IFactory
{
    IProduct CreateProduct();
}

팩토리 인터페이스를 정의한다. 인터페이스에는 특정 타입을 반환할 함수가 선언되어야 한다.

public interface IProduct { }

public class ProductA : IProduct { }

public class ProductB : IProduct { }

팩토리에서 생성될 객체의 공통 타입을 인터페이스(IProduct, 추상클래스도 가능)로 선언해주고, 이를 상속받는 구체적인 Product 클래스를 정의한다.

공통 타입을 사용하는 이유는 팩토리가 더 다양한 Product 객체들을 생성할 수 있게 하기 위함이다.

public class FirstFactory : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductA();
    }
}

public class SecondFactory: IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductB();
    }
}

팩토리 인터페이스를 상속받는 서브 클래스(FirstFactory, SecondFactory)를 선언하고, 인터페이스에서 정의한 팩토리 메소드 CreateProduct( )를 상세 구현한다. 위 코드에서는 각 팩토리마다 다른 Product 객체를 생성하도록 구현하였다.

IFactory firstFactory = new FirstFactory();
IProduct productA = firstFactory.CreateProduct();

IFactory secondFactory = new FirstFactory();
IProduct productB = firstFactory.CreateProduct();

사용할 때는 팩토리를 생성한 다음, 팩토리를 통해 객체 생성 함수를 호출하면 된다.


▶  장점

클래스 결합도 저하 : 직접 객체를 생성하는 것을 방지하여 클래스간의 결합도, 의존도가 낮아짐.

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


  주의

▷ "팩토리 메소드"라는 이름으로 인해서 "객체를 생성하는 모든 함수"를 팩토리 메소드 패턴으로 오해하지 말 것

▷ "추상 팩토리 패턴"과 비슷하나, 역할과 관점이 다름.

반응형

댓글