반응형
1. 팩토리 메서드 패턴의 개념과 구현
팩토리 메서드 패턴은 객체 생성의 책임을 서브클래스에 위임하여, 클라이언트 코드가 구체적인 클래스에 의존하지 않고 객체를 생성할 수 있도록 하는 디자인 패턴입니다.
이 패턴은 생성 패턴(Creational Pattern) 중 하나로, 객체 생성 시점의 유연성을 제공하고 코드의 확장성을 높이는 데 유용합니다.
핵심 개념
- Product (제품): 팩토리 메서드가 생성하는 객체의 타입을 나타내는 인터페이스 또는 추상 클래스입니다.
- Concrete Product (구체 제품): 실제로 생성될 객체를 구현한 클래스입니다.
- Creator (생성자): 팩토리 메서드를 선언하는 클래스입니다.
- Concrete Creator (구체 생성자): 팩토리 메서드를 오버라이드하여 구체 제품 객체를 생성하는 클래스입니다.
2. 인터페이스와 팩토리 메서드 활용
팩토리 메서드 패턴에서는 인터페이스를 활용하여 클라이언트 코드가 구체적인 클래스에 의존하지 않게 합니다. 이렇게 하면 새로운 제품이 추가되더라도 클라이언트 코드는 수정할 필요가 없습니다.
클래스 다이어그램
+------------------+ +-------------------+
| Creator | | Product |
+------------------+ +-------------------+
| + factoryMethod()|<------| |
+------------------+ +-------------------+
^ ^
| |
+------------------+ +-------------------+
| ConcreteCreator1 | | ConcreteProduct1 |
+------------------+ +-------------------+
| + factoryMethod()| | |
+------------------+ +-------------------+
- Product: 제품 객체의 인터페이스입니다.
- ConcreteProduct: 인터페이스를 구현한 구체 클래스입니다.
- Creator: 팩토리 메서드를 선언하는 클래스입니다.
- ConcreteCreator: 팩토리 메서드를 구현하여 실제 객체를 반환하는 클래스입니다.
3. 예제 코드
아래는 팩토리 메서드 패턴의 예제 코드입니다.
Product 인터페이스와 ConcreteProduct 클래스
// Product 인터페이스
interface Product {
void use();
}
// ConcreteProduct1
class ConcreteProduct1 implements Product {
@Override
public void use() {
System.out.println("ConcreteProduct1 사용");
}
}
// ConcreteProduct2
class ConcreteProduct2 implements Product {
@Override
public void use() {
System.out.println("ConcreteProduct2 사용");
}
}
Creator와 ConcreteCreator 클래스
// Creator 클래스
abstract class Creator {
public abstract Product factoryMethod();
public void someOperation() {
Product product = factoryMethod();
product.use();
}
}
// ConcreteCreator1
class ConcreteCreator1 extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProduct1();
}
}
// ConcreteCreator2
class ConcreteCreator2 extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProduct2();
}
}
클라이언트 코드
public class Main {
public static void main(String[] args) {
Creator creator1 = new ConcreteCreator1();
creator1.someOperation();
Creator creator2 = new ConcreteCreator2();
creator2.someOperation();
}
}
출력 결과
ConcreteProduct1 사용
ConcreteProduct2 사용
4. 팩토리 메서드의 장점과 단점
장점
- 유연한 객체 생성: 클라이언트 코드가 구체적인 클래스에 의존하지 않기 때문에 객체 생성 시 유연성이 높아집니다.
- 확장성: 새로운 제품이 추가되더라도 기존 코드를 수정하지 않고 확장할 수 있습니다.
- 단일 책임 원칙(SRP): 객체 생성의 책임을 분리하여 코드의 가독성과 유지보수성을 높입니다.
단점
- 복잡성 증가: 클래스와 서브클래스가 늘어나 코드의 구조가 복잡해질 수 있습니다.
- 추가 구현 비용: 새로운 제품과 생성자를 추가해야 하므로 초기 설계 및 구현에 시간이 필요합니다.
결론
팩토리 메서드 패턴은 객체 생성의 책임을 서브클래스에 위임함으로써 코드의 유연성과 확장성을 높여줍니다. 하지만 코드 구조가 복잡해질 수 있으므로 필요에 따라 적절하게 사용하는 것이 중요합니다.
반응형
'JAVA > JAVA Design Pattern' 카테고리의 다른 글
Singleton Pattern in Java (0) | 2024.12.19 |
---|---|
JAVA 디자인 패턴 개요 (0) | 2024.12.18 |