728x90
추상 팩토리 패턴(Abstract Factory Pattern)은 관련 객체들의 군(군집)을 생성하는 데 사용되는 생성 패턴 중 하나입니다. 이 패턴은 상위 레벨에서 구체적인 클래스에 의존하지 않고, 관련 객체들을 그룹화하여 생성하는 인터페이스를 제공합니다.
추상 팩토리 패턴의 특징
- 객체 군의 생성: 관련된 객체들을 하나의 팩토리로 묶어 일관된 방식으로 생성합니다.
- 구현체 독립성: 구체적인 클래스에 의존하지 않고 인터페이스 또는 추상 클래스를 통해 객체를 생성합니다.
- 확장성: 새로운 제품군이 추가될 때 기존 코드에 영향을 최소화합니다.
사용 시점
- 서로 관련된 객체들이 같이 사용되어야 할 때.
- 시스템이 구체적인 클래스에 의존하지 않고, 상위 수준의 인터페이스를 사용해야 할 때.
- 객체를 생성하는 구체적인 코드와 클라이언트 코드의 결합도를 낮추고 싶을 때.
추상 팩토리 패턴 구조
주요 구성 요소
- AbstractFactory: 제품군을 생성하는 인터페이스 또는 추상 클래스.
- ConcreteFactory: AbstractFactory의 구체적인 구현체로, 실제 제품을 생성합니다.
- AbstractProduct: 생성할 제품의 인터페이스 또는 추상 클래스.
- ConcreteProduct: AbstractProduct의 구체적인 구현체로, 팩토리가 생성하는 실제 객체입니다.
- Client: 팩토리를 사용하여 객체를 생성하고 사용하는 코드.
자바에서의 구현
1. AbstractProduct 정의
// 제품 A 인터페이스
public interface ProductA {
void useA();
}
// 제품 B 인터페이스
public interface ProductB {
void useB();
}
2. ConcreteProduct 정의
// 구체적인 제품 A1
public class ProductA1 implements ProductA {
@Override
public void useA() {
System.out.println("사용 중: ProductA1");
}
}
// 구체적인 제품 A2
public class ProductA2 implements ProductA {
@Override
public void useA() {
System.out.println("사용 중: ProductA2");
}
}
// 구체적인 제품 B1
public class ProductB1 implements ProductB {
@Override
public void useB() {
System.out.println("사용 중: ProductB1");
}
}
// 구체적인 제품 B2
public class ProductB2 implements ProductB {
@Override
public void useB() {
System.out.println("사용 중: ProductB2");
}
}
3. AbstractFactory 정의
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
4. ConcreteFactory 정의
// 구체적인 팩토리 1
public class Factory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ProductA1();
}
@Override
public ProductB createProductB() {
return new ProductB1();
}
}
// 구체적인 팩토리 2
public class Factory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ProductA2();
}
@Override
public ProductB createProductB() {
return new ProductB2();
}
}
5. Client 코드
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
// 팩토리 1 사용
AbstractFactory factory1 = new Factory1();
ProductA productA1 = factory1.createProductA();
ProductB productB1 = factory1.createProductB();
productA1.useA();
productB1.useB();
// 팩토리 2 사용
AbstractFactory factory2 = new Factory2();
ProductA productA2 = factory2.createProductA();
ProductB productB2 = factory2.createProductB();
productA2.useA();
productB2.useB();
}
}
출력:
사용 중: ProductA1
사용 중: ProductB1
사용 중: ProductA2
사용 중: ProductB2
장단점
장점
- 객체 생성 로직 분리: 클라이언트는 구체적인 객체 생성 로직을 알 필요가 없습니다.
- 일관성 유지: 관련된 객체들을 그룹화하여 일관된 인터페이스로 생성합니다.
- 확장성: 새로운 팩토리나 제품군을 추가하기 쉽습니다.
단점
- 복잡성 증가: 클래스와 인터페이스의 수가 늘어나 코드가 복잡해질 수 있습니다.
- 유연성 제한: 팩토리가 고정된 제품군을 생성하므로, 동적으로 다른 제품군을 조합하기 어렵습니다.
결론
추상 팩토리 패턴은 객체 생성과 관련된 코드의 결합도를 낮추고, 관련된 객체들을 그룹화하여 관리할 수 있는 강력한 디자인 패턴입니다. 특히, 여러 제품군이 존재하고 이들을 일관되게 생성해야 하는 상황에서 유용합니다. 하지만 코드 복잡도가 증가할 수 있으므로, 설계 요구 사항에 따라 신중히 적용해야 합니다.
728x90
'Design Pattern with Java' 카테고리의 다른 글
5. 템플릿메소드 패턴(Template Method) (0) | 2025.01.15 |
---|---|
4. Builder 패턴(from effective-java) (0) | 2025.01.07 |
4. builder 패턴(gof) (0) | 2025.01.07 |
2.프로토타입 패턴(Prototype Pattern) (0) | 2025.01.07 |
1. 싱글톤 패턴(Singleton Pattern) (0) | 2025.01.07 |