[디자인패턴] 생성 패턴 - 팩토리 메서드

정의

  • 객체를 생성하는 인터페이스를 제공함.
  • 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브 클래스에서 이루어지게 한다.
  • 객체의 생성로직을 클라이언트 코드에 노출시키지 않음.

예제

// Abstract Product
interface Logger {
    void log(String message);
}
  • Logger 인터페이스 생성
// Concrete Product 1
class FileLogger implements Logger {
    public void log(String message) {
        System.out.println("Logging to a file: " + message);
    }
}

// Concrete Product 2
class ConsoleLogger implements Logger {
    public void log(String message) {
        System.out.println("Logging to the console: " + message);
    }
}
  • 다양한 타입의 로거를 구현
  • 각각 파일과 콘솔에 로깅하는 로직을 정의할 수 있다.

// Abstract Creator
abstract class LoggerFactory {
    abstract Logger createLogger();

    public void logMessage(String message) {
        Logger logger = createLogger();
        logger.log(message);
    }
}
  • 추상 생성자인 LoggerFactory정의
  • createLogger 추상 메서드를 정의하여 로거 객체를 생성한다.
  • logMessage 를 통해 메시지를 로깅가능하다.

class FileLoggerFactory extends LoggerFactory {
    Logger createLogger() {
        return new FileLogger();
    }
}

class ConsoleLoggerFactory extends LoggerFactory {
    Logger createLogger() {
        return new ConsoleLogger();
    }
}
  • 구현체 생성자
    • 생성을 담당하는 클래스를 concrete creator 라고 한다.
  • createLogger 를 구현하는데
    • 객체의 생성로직을 구현한다.
    • 외부에 객체의 생성에 대해 캡슐화를 수행함.

public class Client {
    public static void main(String[] args) {
        LoggerFactory fileLoggerFactory = new FileLoggerFactory();
        fileLoggerFactory.logMessage("This is a message to be logged in a file.");

        LoggerFactory consoleLoggerFactory = new ConsoleLoggerFactory();
        consoleLoggerFactory.logMessage("This is a message to be logged in the console.");
    }
}
  • 분기를 나누지 않고 별도의 객체를 각각의 의도에 맞게 생성가능하다.

장점

  1. 객체 생성 캡슐화
    • 클라이언트는 객체 생성관련한 내용을 알 필요가 없다.
  1. 코드의 확장성
    • 새로운 종류의 로거 추가를 위해 별도의 concrete product 와 concrete creator 클래스만 추가하면 된다.
  1. 단일 책임 원칙
    • 각 클래스는 자신의 주요 책임을 수행한다.
    • LoggerFactory 클래스는 객체 생성에 중점을 둔다.

단점

  1. 코드의 양
    • 클래스의 분화의 정도가 심각해진다..
    • 어떤 기능을 추가하기 위하여 너무 많은 클래스로 분화되게 된다.

Uploaded by N2T