..

팩토리 패턴(Factory Pattern): 객체 생성의 책임 분리

1. 팩토리 패턴이란?

팩토리 패턴(Factory Pattern)은 객체 지향 프로그래밍에서 객체 생성 처리를 서브 클래스나 별도의 팩토리 클래스에 위임하는 디자인 패턴입니다.

“생성될 객체의 정확한 클래스를 클라이언트 코드(사용자)가 직접 지정하지 않고, 팩토리 인터페이스를 통해 객체를 생성하는 방법입니다.”

2. 왜 사용하는가? (도입 배경)

애플리케이션 코드 곳곳에서 new 키워드를 사용해 직접 객체를 생성하면, 해당 코드는 특정 클래스와 강력하게 결합(Coupled)됩니다.

  • 결합도 문제: 클래스 이름이 바뀌거나 생성 방식이 변경되면 애플리케이션의 수많은 곳을 일일이 수정해야 합니다.
  • 캡슐화 미흡: 클라이언트 코드가 객체 생성의 복잡한 세부 사항까지 알 필요가 없는데, new를 남발하면 내부 구조를 노출하게 됩니다.

팩토리 패턴은 생성 로직을 별도의 클래스로 캡슐화하여, 클라이언트 코드가 구체적인 클래스 이름 대신 인터페이스나 추상 클래스만 바라보고 작업할 수 있게 해줍니다.

3. 주요 이점

  1. 느슨한 결합 (Loose Coupling): 애플리케이션 코드와 실제 객체 간의 의존성이 낮아집니다.
  2. 확장성: 기존의 클라이언트 코드를 건드리지 않고도 새로운 타입의 객체(구현체)를 팩토리에 추가하여 확장할 수 있습니다.

4. 실무 예제 코드 (Java)

다양한 파트너사에게 메시지를 전송하는 기능을 팩토리 패턴으로 구현해 보겠습니다.

// 1. 공통 인터페이스 정의
public interface MessageService {
    void send();
}

// 2. 각 파트너사별 구현체
public class ShinhanMessage implements MessageService {
    public void send() { System.out.println("신한은행으로 전송"); }
}

public class NHMessage implements MessageService {
    public void send() { System.out.println("농협은행으로 전송"); }
}

// 3. 객체 생성을 전담하는 팩토리 클래스
public class MessageFactory {
    public static MessageService getService(String partner) {
        switch (partner) {
            case "신한": return new ShinhanMessage();
            case "농협": return new NHMessage();
            default: throw new IllegalArgumentException("지원하지 않는 파트너입니다.");
        }
    }
}

// 4. 클라이언트 코드 (new를 사용하지 않음)
public void sendMessage(String partnerName) {
    // 팩토리를 통해 인터페이스 형식으로 객체를 받음
    MessageService service = MessageFactory.getService(partnerName);
    service.send();
}

팩토리 패턴은 “어떤 객체를 만들지는 팩토리가 고민할 테니, 너는 그저 사용하기만 해”라고 역할을 분담하는 스마트한 설계 방식입니다.