Factory Method

Lee Luda·2024년 6월 27일
3

DesignPattern

목록 보기
1/2

Factory Method


Factory Method Pattern은 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하며, 자식 클래스들이 생성될 객체 등의 유형을 변경할 수 있도록 하는 생성 패턴이다.

그렇기 때문에 자식 클래스들은 팩토리 메서드가 반환하는 객체들의 클래스를 변경할 수 있다.
기존 코드의 변경 없이 확장하기 위한 디자인 패턴이며, 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하여 즉, 인스턴스 생성을 서브 클래스에 위임한다.

사용시기


  • 클래스 생성과 사용의 처리 로직을 분리하여 결합도를 낮추고자 할 때 사용한다.
  • 코드가 동작해야 하는 객체의 유형과 종속성을 캡슐화를 통해 정보 은닉 처리를 할 경우에 사용한다.
  • 기존 객체를 재구성하는 대신 기존 객체를 재사용하여 리소스를 절약하고자 하는 경우에 사용한다.

아래와 같은 예시로 사용법을 알아보겠다.

클래스 구성


출처

//제품 객체 추상화
interface IProduct{
    void setting();
}

//제품 구현체
class ConcreteProductA implements Iproduct{
    public void setting(){
    }
}

class ConcreteProductB implements Iproduct{
    public void setting(){
    }
}
  • IProduct 객체를 인터페이스로 추상화한다.
  • ConcreteProductA, ConcreteProductB로 상속받는다.
//공장 객체 추상화
abstract class AbstractFactory{
    //객체 생성 전처리 후처리 메서드
    final Iproduct createOperation(){
        Iproduct product = createProduct();
        product.setting();
        return product;
    }
    //팩토리 메서드: 구체적인 객체 생성 종류는 각 서브 클래스에 위임
    abstract protected IProduct createProduct();
}

class ConcreteFactoryA extends AbstractFactory{
    @Override
    public IProduct createProduct(){
        return new ConcreateProductA();
    }
}

class ConcreteFactoryB extends AbstractFactory{
    @Override
    public IProduct createProduct(){
        return new ConcreateProductB();
    }
}
  • Factory 객체를 추상 클래스로 선언한다.
  • Final IProduct로 제품 객체를 생성하고 추가 생성 및 product를 반환한다.
  • ConcreteFactoryAConcreteFactoryB를 추상 클래스를 확장하여 선언하고 각각 productA와 productB를 반환한다.

클래스 흐름


출처

class Client{
    public static void main(String[] args){
        // 1. 공장 객체 생성
        AbstractFactory[] factory = {
            new ConcreteFactoryA(),
            new ConcreteFactoryB()
        };
    }
    // 2. productA 생성
    IProduct productA = factory[0].createOperation();
    // 3. productB 생성
    IProduct productB = factory[1].createOperation();
}

장점과 단점


장점

  • 생성자와 구현 객체의 강한 결합을 피할 수 있다.
  • 팩토리 메서드를 통해 객체의 생성 후 공통으로 할 일을 수행하도록 지정해 줄 수 있다.
  • 캡슐화, 추상화를 통해 생성되는 객체의 구체적인 타입을 감출 수 있다.
  • 단일 책임 원칙 준수: 객체 생성 코드를 한곳으로 하여 코드를 유지 보수하기 쉽게 할 수 있으므로 원칙을 만족한다.
  • 개방/폐쇄 원칙 준수: 기존 코드를 수정하지 않고 새로운 유형의 product 인스턴스를 프로그램에 도입할 수 있어 원칙을 만족한다.

단점

  • 각 product 구현체마다 팩토리 객체들을 모두 구현해 주어야 하기 때문에, 구현체가 늘어날 때마다 팩토리 클래스가 증가하여 서브 클래스 수가 기하급수적으로 늘어난다.
  • 코드의 복잡성이 증가한다.

Reference


https://inpa.tistory.com/entry/GOF-💠-팩토리-메서드Factory-Method-패턴-제대로-배워보자#thankYou

https://bcp0109.tistory.com/367

https://ko.wikipedia.org/wiki/팩토리_메서드_패턴

참조하면 좋을 만한 빌더 패턴 글

참조하면 좋을 만한 디자인 패턴 - 싱글톤 패턴 글

profile
To Luda

0개의 댓글