자바 디자인 패턴
*4. Factory Method - 하위 클래스에서 인스턴스를 만든다
조요피
2023. 10. 8. 22:32
4. Factory Method - 하위 클래스에서 인스턴스를 만든다
인스턴스를 생성을 Template Method 패턴으로 구성한 것이 Factory Method 패턴.
Factory Method 패턴에서는 인스턴스 생성 방법을 상위 클래스에서 결정하지만, 구체적인 클래스 이름까지는 결정하지 않음.
예제
Factory Method 패턴은 객체 생성을 캡슐화하고, 클라이언트 코드로부터 구체적인 클래스의 인스턴스 생성을 분리하기 위한 디자인 패턴 중 하나입니다. 이 패턴은 객체 지향 프로그래밍에서 많이 사용되며,
확장성과 유지보수성을 향상시키는데 도움이 됩니다.
Factory Method 패턴은 다음과 같은 주요 구성 요소로 이루어져 있습니다:
- Creator (생성자) 인터페이스 또는 추상 클래스: 이 인터페이스나 추상 클래스는 팩토리 메서드를 정의하며, 클라이언트 코드가 객체를 생성할 때 사용하는 메서드를 선언합니다. 이것은 객체를 생성하는 책임을
서브클래스에게 위임합니다. - Concrete Creator (구체적인 생성자): Creator를 상속받는 하나 이상의 구체적인 클래스가 있습니다. 이 클래스들은 팩토리 메서드를 구현하여 실제 객체를 생성하고 반환합니다.
- Product (제품) 인터페이스 또는 추상 클래스: 팩토리 메서드에 의해 생성된 객체의 공통 인터페이스를 정의합니다. 이것은 클라이언트 코드가 생성된 객체를 조작하기 위한 방법을 제공합니다.
- Concrete Product (구체적인 제품): Product를 구현하는 클래스들입니다. 팩토리 메서드에 의해 생성되며, 실제 작업을 수행합니다.
Factory Method 패턴을 사용하면 클라이언트 코드는 구체적인 클래스 대신 Creator 인터페이스 또는 추상 클래스와 그것이 제공하는 팩토리 메서드를 사용하여 객체를 생성할 수 있습니다. 이렇게 하면
클라이언트 코드와 구체적인 클래스 간의 결합도가 낮아지므로, 코드 유지보수와 확장이 쉬워집니다. 또한, 다양한 구현을 손쉽게 교체하거나 확장할 수 있는 장점이 있습니다.
아래는 Java에서 Factory Method 패턴을 구현하는 간단한 예제입니다:
// Product 인터페이스
interface Product {
void operation();
}
// ConcreteProduct1 클래스
class ConcreteProduct1 implements Product {
@Override
public void operation() {
System.out.println("ConcreteProduct1 operation");
}
}
// ConcreteProduct2 클래스
class ConcreteProduct2 implements Product {
@Override
public void operation() {
System.out.println("ConcreteProduct2 operation");
}
}
// Creator 인터페이스
interface Creator {
Product factoryMethod();
}
// ConcreteCreator1 클래스
class ConcreteCreator1 implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProduct1();
}
}
// ConcreteCreator2 클래스
class ConcreteCreator2 implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProduct2();
}
}
public class FactoryMethodExample {
public static void main(String[] args) {
Creator creator1 = new ConcreteCreator1();
Product product1 = creator1.factoryMethod();
product1.operation(); // ConcreteProduct1 operation
Creator creator2 = new ConcreteCreator2();
Product product2 = creator2.factoryMethod();
product2.operation(); // ConcreteProduct2 operation
}
}
이 예제에서는 Creator와 ConcreteCreator 클래스가 팩토리 메서드를 구현하고, Product와 ConcreteProduct 클래스가 실제 객체를 나타냅니다. 클라이언트 코드는 Creator
인터페이스를 통해 객체를 생성하고 조작할 수 있습니다.