팩토리 메서드 Factory Method
🙈

팩토리 메서드 Factory Method

Created
Apr 15, 2024 02:32 AM
Last edited time
Last updated April 15, 2024
Tags
CS
Language
Java
URL

Intro::

디자인 패턴 중 생성 패턴의 하나인 팩토리 메서드에 대해 알아봅시다.
 

팩토리 메서드 Factory Method 란?

팩토리 메서드 패턴은 객체 지향 프로그래밍에서 객체 생성 처리를 서브클래스로 분리해 캡슐화하는 디자인 패턴입니다. 이 패턴의 목적은 클라이언트 코드와 인스턴스를 만들어야 하는 구체적 클래스를 분리하는 것입니다. 이를 통해 클라이언트는 다양한 구현체를 유연하게 사용할 수 있는 확장성을 갖출 수 있습니다.
 

주요 구성 요소

  1. Creator - 객체를 생성하는 메서드를 선언하는 클래스. 이 메서드는 일반적으로 추상 메서드로, 서브 클래스에서 구현됩니다.
  1. ConcreteCreator - Creator 클래스를 상속받아 팩토리 메서드를 실제로 구현하는 클래스입니다. 이 메서드는 특정 ConcreteProduct 객체를 반환합니다.
  1. Product - 생성된 객체의 인터페이스를 정의합니다. ConcreteCreator는 이 인터페이스를 구현한 객체를 생성합니다.
  1. ConcreteProduct - Product 인터페이스를 구현하는 실제 객체로, ConcreteCreator에 의해 생성됩니다.
 

장점

  • 결합도 감소: 팩토리 메서드 패턴은 클라이언트 코드와 구체적인 생성 로직을 분리함으로써, 시스템의 결합도를 낮춥니다. 클라이언트는 생성될 객체의 구체적인 타입을 몰라도 되며, 팩토리 메서드를 통해 인터페이스로 객체를 받습니다.
  • 확장성 향상: 새로운 종류의 객체를 추가하고자 할 때, 기존 코드를 수정하지 않고 새로운 서브클래스를 만들어 팩토리 메서드를 재정의하기만 하면 됩니다. 이는 오픈/클로즈 원칙(Open/Closed Principle)을 잘 따르는 설계 방식입니다.
  • 서브클래스에 대한 유연한 정책 적용: 생성하려는 객체의 선택 또는 구성 방식을 서브클래스에서 유연하게 결정할 수 있습니다. 이는 다양한 상황과 환경에 맞춰 동적으로 객체를 생성할 수 있는 능력을 제공합니다.
  • 코드 재사용성 증가: 공통 인터페이스를 사용함으로써 코드의 재사용성이 증가하고, 유지 보수가 용이해집니다.
 

단점

  • 클래스 수 증가: 각각의 구체적인 제품에 대해 새로운 클래스를 생성해야 하기 때문에 시스템의 복잡성이 증가할 수 있습니다. 이는 관리해야 할 클래스의 수가 많아지는 결과를 초래합니다.
  • 코드 복잡성 증가: 팩토리 메서드를 사용함에 따라, 간단한 객체 생성 요구사항에 대해 불필요하게 복잡한 설계가 도입될 수 있습니다. 특히, 생성해야 할 객체가 많지 않거나 매우 간단할 경우, 팩토리 메서드 패턴은 과도한 설계로 볼 수 있습니다.
  • 개발 과정에서의 오버헤드: 각 객체에 대한 팩토리 클래스를 별도로 구현해야 하므로 개발 초기 단계에서 설계와 구현에 더 많은 시간과 노력이 소요될 수 있습니다.
 

코드 예시

// Product 인터페이스 public interface Document { void open(); void close(); void save(); } // ConcreteProduct 클래스들 public class WordDocument implements Document { public void open() { System.out.println("Opening a Word document."); } public void close() { System.out.println("Closing the Word document."); } public void save() { System.out.println("Saving the Word document."); } } public class PdfDocument implements Document { public void open() { System.out.println("Opening a PDF document."); } public void close() { System.out.println("Closing the PDF document."); } public void save() { System.out.println("Saving the PDF document."); } } // Creator 클래스 public abstract class Application { public abstract Document createDocument(); } // ConcreteCreator 클래스 public class WordApplication extends Application { public Document createDocument() { return new WordDocument(); } } public class PdfApplication extends Application { public Document createDocument() { return new PdfDocument(); } }
 

References::

Loading Comments...