본문 바로가기

JAVA/디자인 패턴

[Design Pattern] Factory Method(팩토리 메서드) 패턴이란?

반응형
생성 패턴(Creational Pattern)


팩토리 메서드 패턴은 객체를 생성하는 일을 전담하는 팩토리 클래스를 이용하여 객체를 생성하는 방식입니다. 이러한 패턴을 이용하면 객체 생성의 책임을 각 객체의 생성자에서 분리하여 팩토리 클래스에 위임함으로써, 유지보수성, 확장성, 유연성 등을 높일 수 있습니다.

 

Factory Method를 사용 하는 이유

첫째, 객체를 생성하는 코드와 사용하는 코드를 분리하여 결합도를 낮출 수 있습니다. 객체를 생성하는 부분과 사용하는 부분이 분리되기 때문에, 객체의 변경이나 추가 등의 수정이 있을 때 객체 생성 코드를 수정하지 않아도 됩니다. 따라서, 코드의 유연성과 확장성을 높일 수 있습니다.

둘째, 객체 생성 과정을 캡슐화하여 추상화된 인터페이스를 제공할 수 있습니다. 팩토리 메서드 패턴에서는 객체 생성 코드를 캡슐화하여 Creator 인터페이스를 제공하고, 이를 이용하여 객체를 생성합니다. 이렇게 하면, 객체 생성 과정을 단순화할 수 있고, 사용자가 생성 과정을 알 필요가 없으므로 코드를 간결하게 유지할 수 있습니다.


Factory Method 패턴의 구성 요소

  • Creator: 객체를 생성하는 팩토리 메서드를 정의하는 추상 클래스나 인터페이스입니다. Creator 클래스는 팩토리 메서드를 이용하여 객체를 생성하고 반환합니다.
  • ConcreteCreator: Creator 클래스를 상속받아 팩토리 메서드를 구현한 클래스입니다. 새로운 객체를 생성하여 반환하는 역할을 합니다.
  • Product: 팩토리 메서드로 생성될 객체의 추상 클래스나 인터페이스입니다. 팩토리 메서드에 의해 생성될 객체의 타입을 정의합니다.
  • ConcreteProduct: Product 클래스를 상속받아 구현한 클래스입니다. 팩토리 메서드로 생성될 구체적인 객체입니다.

Factory Method 패턴의 작동 방식

  1. 클라이언트는 Creator 클래스의 팩토리 메서드를 호출하여 새로운 객체를 생성합니다.
  2. Creator 클래스는 팩토리 메서드를 이용하여 새로운 객체를 생성합니다.
  3. 생성된 객체를 반환하여 클라이언트에게 전달합니다.

Factory Method 패턴의 장점

  • 객체 생성과정을 캡슐화함으로써 객체 생성과 관련된 코드의 중복을 줄일 수 있습니다.
  • 객체 생성과정을 외부에 노출하지 않기 때문에 객체 생성에 대한 유연성을 높일 수 있습니다.
  • 객체 생성과정이 복잡할 경우 Creator 클래스를 상속받아 팩토리 메서드를 구현하기만 하면 되므로 유지보수성이 높아집니다.


Factory Method 패턴의 단점

  • 팩토리 메서드를 정의해야 하므로, 클래스의 개수가 늘어날 수 있습니다.
  • 팩토리 메서드에서 생성된 객체가 일반적으로 Creator 객체와 결합될 수 있으므로, 객체 간의 결합도가 높아질 수 있습니다.

Factory Method 패턴 예제

 

예시로, 과일 팩토리를 만들어서 과일 객체를 생성하는 예제를 작성해보겠습니다.

Diagrams



우선, Product 인터페이스와 Product를 구현하는 Apple과 Banana 클래스를 정의합니다.

 

// Product 인터페이스
public interface Product {
    public String getName();
}

// Apple 클래스
public class Apple implements Product {
    @Override
    public String getName() {
        return "Apple";
    }
}

// Banana 클래스
public class Banana implements Product {
    @Override
    public String getName() {
        return "Banana";
    }
}

 

 

다음으로, Creator 인터페이스와 Creator를 구현하는 FruitCreator 클래스를 정의합니다. 이 클래스에서는 Product를 생성하는 팩토리 메서드 createProduct()를 정의합니다.

 

// Factory 인터페이스
public interface Creator {
    public Product createProduct();
}

// Fruit Factory 클래스
public class FruitCreator implements Creator {

    // Factory Method
    @Override
    public Product createProduct() {
        // 랜덤으로 Apple 혹은 Banana 객체 생성하여 반환
        int random = (int) (Math.random() * 2);
        if (random == 0) {
            return new Apple();
        } else {
            return new Banana();
        }
    }
}

 

 

마지막으로, 메인 메서드에서 FruitCreator를 이용하여 Product를 생성하고, 해당 Product의 이름을 출력합니다.

 

public class Main {
    public static void main(String[] args) {
        Creator creator = new FruitCreator();
        Product product = creator.createProduct();
        System.out.println("Created product: " + product.getName());
    }
}

 

위 코드에서, FruitCreator 클래스에서는 랜덤으로 Apple 혹은 Banana 객체를 생성하여 반환하는 createProduct() 메서드를 구현합니다. 이를 이용하여 Main 클래스에서는 FruitCreator를 이용하여 Product를 생성하고, 해당 Product의 이름을 출력합니다.

이처럼 팩토리 메서드 패턴을 이용하면, 객체 생성과정을 캡슐화하여 유연성과 재사용성을 높일 수 있습니다.

반응형