소프트웨어 개발에서 객체의 생성과 관리는 중요한 설계 요소 중 하나이다. GoF(Gang of Four) 디자인 패턴 중 생성 패턴(Creational Patterns)은 객체의 생성과 관련된 문제를 해결하는 패턴으로, 보다 유연하고 효율적인 객체 생성을 돕는다. 이 중 팩토리 메서드 패턴은 객체 생성을 캡슐화하여 코드의 유연성과 유지보수성을 향상시키는 데 중점을 둔다.
1. 팩토리 메서드 패턴이란?
팩토리 메서드 패턴은 생성 패턴 (Creational Patterns)의 하나로써 객체 생성을 캡슐화하여 객체의 구체적인 생성 과정을 서브클래스에서 정의하도록 하는 패턴이다. 즉, 객체 생성을 담당하는 팩토리 메서드를 제공하여, 객체 생성을 위한 코드를 직접 작성하는 대신 서브클래스에서 필요에 따라 인스턴스를 반환하도록 한다. 이를 통해 객체 생성의 유연성을 높이고 코드의 유지보수성을 향상시킬 수 있다.
특징
- 객체 생성 캡슐화: 객체를 생성하는 로직을 별도의 메서드로 분리하여 관리할 수 있다.
- 유연한 객체 생성: 구체적인 클래스의 인스턴스를 직접 생성하는 것이 아니라, 하위 클래스에서 객체 생성을 담당하게 한다.
- 코드의 결합도를 낮춤: 클라이언트 코드가 특정 클래스의 인스턴스를 직접 생성하지 않으므로, 코드 변경 시 영향을 최소화할 수 있다.
2. 팩토리 메서드 패턴의 구조
팩토리 메서드 패턴은 다음과 같은 구성 요소로 이루어진다.
- Product(제품 인터페이스): 팩토리 메서드가 생성할 객체의 인터페이스를 정의한다.
- ConcreteProduct(구체적인 제품 클래스): Product 인터페이스를 구현하며, 실제 생성될 객체를 의미한다.
- Creator(추상 팩토리 클래스): 팩토리 메서드를 선언하는 클래스이며, 기본적인 동작을 정의한다.
- ConcreteCreator(구체적인 팩토리 클래스): 팩토리 메서드를 오버라이드하여 구체적인 객체를 생성하는 역할을 한다.
3. 팩토리 메서드 패턴 구현 예제
예제: 다양한 유형의 버튼 생성
// 1. Product 인터페이스
interface Button {
void render();
}
// 2. ConcreteProduct 클래스
class WindowsButton implements Button {
public void render() {
System.out.println("Rendering Windows Button");
}
}
class MacButton implements Button {
public void render() {
System.out.println("Rendering Mac Button");
}
}
// 3. Creator 추상 클래스
abstract class Dialog {
// 팩토리 메서드
abstract Button createButton();
public void renderWindow() {
Button button = createButton();
button.render();
}
}
// 4. ConcreteCreator 클래스
class WindowsDialog extends Dialog {
@Override
Button createButton() {
return new WindowsButton();
}
}
class MacDialog extends Dialog {
@Override
Button createButton() {
return new MacButton();
}
}
// 5. 클라이언트 코드
public class FactoryMethodExample {
public static void main(String[] args) {
Dialog dialog = new WindowsDialog(); // Windows 환경
dialog.renderWindow();
dialog = new MacDialog(); // Mac 환경
dialog.renderWindow();
}
}
4. 팩토리 메서드 패턴의 장점과 단점
장점
- 객체 생성 로직을 분리하여 코드 유지보수성 향상
- 새로운 제품을 추가할 때 기존 코드 수정 없이 확장 가능
- 객체 생성 과정을 서브클래스에서 결정할 수 있어 유연한 설계 가능
단점
- 클래스 수 증가: 각 제품마다 팩토리 클래스가 필요하여 코드의 복잡도가 증가할 수 있다.
- 구현이 복잡해질 가능성: 단순한 객체 생성에는 오히려 코드가 복잡해질 수 있어, 사용이 적절한지 판단이 필요하다.
5. 팩토리 메서드 패턴의 활용 사례
5.1 데이터베이스 드라이버 관리
JDBC(Java Database Connectivity)에서 특정 데이터베이스에 맞는 드라이버를 동적으로 선택하는 데 사용된다.
public class DatabaseFactory {
public static Connection getConnection(String type) {
if (type.equals("MySQL")) {
return new MySQLConnection();
} else if (type.equals("PostgreSQL")) {
return new PostgreSQLConnection();
}
return null;
}
}
5.2 웹 브라우저 렌더링 엔진
웹 브라우저에서 HTML을 렌더링할 때, OS 또는 브라우저 타입에 따라 적절한 렌더링 엔진을 선택하는 데 사용된다.
팩토리 메서드 패턴은 객체 생성의 책임을 서브클래스로 넘김으로써, 코드의 유연성과 확장성을 높일 수 있는 강력한 패턴이다. 그러나 사용이 불필요하게 복잡해질 수 있으므로, 단순한 객체 생성에는 적절한지 고려할 필요가 있다. 상황에 맞는 패턴을 선택하는 것이 중요하다.
'Programming > Design Patterns' 카테고리의 다른 글
GoF 디자인 패턴 - 어댑터 패턴 (Adapter Pattern) (1) | 2025.04.18 |
---|---|
GoF 디자인 패턴 - 프로토타입 패턴 (Prototype Pattern) (0) | 2025.04.10 |
GoF 디자인 패턴 - 빌더 패턴 (Builder Pattern) (0) | 2025.04.09 |
GoF 디자인 패턴 - 추상 팩토리 패턴 (Abstract Factory Pattern) (2) | 2025.04.08 |
GoF 디자인 패턴 - 싱글톤 패턴 (Singleton Pattern) (0) | 2025.04.08 |