개발/자바

[자바] 팩토리 메서드(Factory Method) 패턴

조용한닭 2024. 1. 10. 16:14
728x90
반응형

정의:

팩토리 메서드 패턴은 객체 생성을 처리하는 인터페이스를 정의하되, 객체의 생성을 서브 클래스에게 위임하여 구체적인 클래스의 선택을 서브 클래스로 미루는 디자인 패턴입니다.

장점:

  1. 유연성 증가: 객체 생성을 서브 클래스에 위임함으로써 새로운 종류의 객체를 추가하거나 기존 객체를 변경할 수 있습니다.
  2. 코드 재사용성: 팩토리 메서드는 공통된 인터페이스를 제공하므로 클라이언트 코드는 구체적인 클래스의 생성 로직을 알 필요 없이 객체를 생성할 수 있습니다.
  3. 확장성: 새로운 서브 클래스를 추가함으로써 시스템을 확장하는 데 용이합니다.

단점:

  1. 클래스 수 증가: 새로운 객체를 추가할 때마다 새로운 팩토리 클래스가 필요하므로 클래스의 수가 늘어날 수 있습니다.
  2. 구현 강제: 팩토리 메서드 패턴은 인터페이스나 추상 클래스를 사용하므로, 서브 클래스에서 반드시 팩토리 메서드를 구현해야 합니다.

언제 사용하는지?

  1. 객체 생성이 변할 때: 객체의 생성이 런타임에 결정되거나, 객체 생성 로직이 자주 변경될 때 사용합니다.
  2. 클래스 계통이 확장 가능할 때: 여러 클래스가 공통된 인터페이스를 공유하면서도 각자 다른 객체를 생성해야 할 때 사용합니다.

 

예시 코드

// Product: 생성될 객체의 인터페이스 또는 추상 클래스
interface Animal {
    void makeSound();
}

// ConcreteProduct: 실제로 생성될 객체
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("야옹!");
    }
}

// Creator: 팩토리 메서드를 정의하는 클래스 (인터페이스 또는 추상 클래스)
interface AnimalFactory {
    Animal createAnimal();
}

// ConcreteCreator: 실제로 팩토리 메서드를 구현하는 클래스
class DogFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

class CatFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}

// Client: 팩토리 메서드를 사용하는 클라이언트 코드
public class FactoryMethodExample {
    public static void main(String[] args) {
        AnimalFactory dogFactory = new DogFactory();
        Animal dog = dogFactory.createAnimal();
        dog.makeSound();  // 출력: 멍멍!

        AnimalFactory catFactory = new CatFactory();
        Animal cat = catFactory.createAnimal();
        cat.makeSound();  // 출력: 야옹!
    }
}

이 예제에서는 AnimalFactory 인터페이스가 팩토리 메서드를 정의하고, DogFactoryCatFactory 클래스가 실제로 이를 구현합니다. 클라이언트 코드에서는 원하는 동물의 팩토리를 생성하고 해당 팩토리의 createAnimal() 메서드를 호출하여 동물을 생성합니다. 팩토리 메서드 패턴을 통해 클라이언트는 객체의 생성 로직을 알 필요 없이 객체를 생성할 수 있습니다.

 

 

728x90
반응형