객체지향 설계에서는 코드의 재사용성과 확장성을 높이기 위해 다양한 설계 패턴을 사용합니다. 이 중에서도 팩토리 메서드(Factory Method)와 추상 팩토리(Abstract Factory) 패턴은 객체 생성에 관련된 두 가지 중요한 패턴입니다. 이 글에서는 팩토리 메서드와 추상 팩토리 패턴의 개념과 차이점을 살펴보고, 언제 어떤 패턴을 선택해야 하는지에 대해 논의하겠습니다.
팩토리 메서드 패턴
팩토리 메서드 패턴은 객체 생성을 캡슐화하여, 객체 생성 로직을 서브클래스에서 정의하도록 하는 패턴입니다. 이 패턴은 클래스의 인스턴스를 만드는 로직을 서브클래스에 위임함으로써, 코드의 유연성을 높입니다.
주요 특징
- 생성 로직의 캡슐화: 객체를 생성하는 코드가 클래스 내에 하드코딩되지 않고, 서브클래스에서 구체적인 객체 생성 방식을 정의합니다.
- 유연한 구조: 새로운 클래스가 추가되더라도 기존 코드를 수정하지 않고 확장할 수 있습니다.
- 상속 사용: 팩토리 메서드 패턴은 상속을 통해 구현되며, 서브클래스가 구체적인 생성 방법을 결정합니다.
구현 예시
abstract class Creator {
// 팩토리 메서드
public abstract Product createProduct();
public void someOperation() {
Product product = createProduct();
// 제품을 가지고 작업 수행
}
}
class ConcreteCreatorA extends Creator {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
추상 팩토리 패턴
추상 팩토리 패턴은 관련된 객체들의 패밀리를 생성할 수 있는 인터페이스를 제공합니다. 클라이언트는 구체적인 클래스의 이름을 명시하지 않고도, 관련된 객체를 생성할 수 있습니다. 이 패턴은 팩토리 메서드 패턴의 확장으로 볼 수 있으며, 서로 관련 있는 여러 제품군을 생성해야 할 때 유용합니다.
주요 특징
- 제품군 생성: 여러 제품군을 생성할 때, 제품 간의 일관성을 유지할 수 있습니다.
- 인터페이스 기반: 클라이언트는 구체적인 클래스 대신 인터페이스를 통해 객체를 생성하므로, 코드의 결합도를 낮출 수 있습니다.
- 제품군 확장 용이성: 새로운 제품군이 추가되어도 클라이언트 코드를 변경하지 않고 확장할 수 있습니다.
구현 예시
// 추상 팩토리
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// 구체적인 팩토리 1
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
// 구체적인 팩토리 2
class MacOSFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacOSButton();
}
@Override
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}
팩토리 메서드와 추상 팩토리의 비교
- 목적:
- 팩토리 메서드: 객체 생성을 서브클래스에 위임하여, 코드의 확장성을 높입니다.
- 추상 팩토리: 관련된 객체들의 패밀리를 생성하여, 일관성을 유지하면서 제품군을 확장할 수 있습니다.
- 구조:
- 팩토리 메서드: 상속을 통해 객체 생성 방식을 서브클래스에서 정의합니다.
- 추상 팩토리: 인터페이스를 통해 제품군을 생성하며, 클라이언트는 구체적인 클래스 이름을 몰라도 됩니다.
- 적용 상황:
- 팩토리 메서드: 하나의 제품을 생성할 때, 생성 로직을 캡슐화하고 서브클래스에서 구체적인 생성 방식을 정의할 필요가 있을 때 사용합니다.
- 추상 팩토리: 여러 관련된 제품군을 생성해야 하고, 이들 간의 일관성을 유지해야 할 때 사용합니다.
결론
팩토리 메서드와 추상 팩토리 패턴은 객체 생성 관련 문제를 해결하기 위한 강력한 도구입니다. 팩토리 메서드는 유연한 객체 생성을 가능하게 하고, 추상 팩토리는 여러 제품군을 일관되게 생성할 수 있게 합니다. 설계할 때 필요한 요구사항에 맞춰 이들 패턴을 적절히 선택하면, 코드의 재사용성과 유지보수성을 크게 향상시킬 수 있습니다.