Abstract Factory
What is❔
Abstract Factory 패턴은 구체적인 클래스에 의존하지 않고, 여러 제품(객체)들의 조합을 생성하는 인터페이스를 제공합니다. 즉, 클라이언트는 구체적인 클래스의 구현 세부 사항에 대해 알 필요 없이, 팩토리 인터페이스를 통해 일관된 방식으로 객체들을 생성할 수 있습니다.
+---------------------+
| AbstractFactory | <-- 제품들의 생성 인터페이스
+---------------------+
| + createProductA() |
| + createProductB() |
+---------------------+
/ \
/ \
/ \
+--------------------+ +--------------------+
| ConcreteFactory1 | | ConcreteFactory2 | <-- 구체적인 팩토리들
+--------------------+ +--------------------+
| + createProductA() | | + createProductA() |
| -> ConcreteA1 | | -> ConcreteA2 |
| + createProductB() | | + createProductB() |
| -> ConcreteB1 | | -> ConcreteB2 |
+--------------------+ +--------------------+
| |
| |
v v
+----------------+ +----------------+
| ConcreteA1 | | ConcreteA2 | <-- 추상 제품 A 구현체들
+----------------+ +----------------+
| |
| |
v v
+----------------+ +----------------+
| ConcreteB1 | | ConcreteB2 | <-- 추상 제품 B 구현체들
+----------------+ +----------------+
예를 들어, 서로 관련된 제품군(ProductA, ProductB 등)을 생성해야 하는 상황에서, AbstractFactory 인터페이스를 통해 제품들의 조합을 생성할 수 있습니다.
How do Code❔
// 추상 제품 A
public interface ProductA {
void performA();
}
// 추상 제품 B
public interface ProductB {
void performB();
}
// 구체적인 제품 A1
public class ConcreteProductA1 implements ProductA {
@Override
public void performA() {
System.out.println("ConcreteProductA1 작업 수행");
}
}
// 구체적인 제품 A2
public class ConcreteProductA2 implements ProductA {
@Override
public void performA() {
System.out.println("ConcreteProductA2 작업 수행");
}
}
// 구체적인 제품 B1
public class ConcreteProductB1 implements ProductB {
@Override
public void performB() {
System.out.println("ConcreteProductB1 작업 수행");
}
}
// 구체적인 제품 B2
public class ConcreteProductB2 implements ProductB {
@Override
public void performB() {
System.out.println("ConcreteProductB2 작업 수행");
}
}
// Abstract Factory 인터페이스: 제품들의 조합을 생성하는 메서드를 정의
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 구체적인 팩토리 1: 제품 A1과 B1을 생성
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
// 구체적인 팩토리 2: 제품 A2와 B2를 생성
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
// 클라이언트 예제
public class AbstractFactoryDemo {
public static void main(String[] args) {
// 원하는 팩토리를 선택하여 사용
AbstractFactory factory = new ConcreteFactory1();
ProductA productA = factory.createProductA();
ProductB productB = factory.createProductB();
productA.performA();
productB.performB();
}
}
목적: 구체적인 클래스에 의존하지 않고, 관련된 객체들의 조합을 생성하는 인터페이스를 제공하여 제품군의 일관된 생성을 보장
장점: 클라이언트는 구체적인 구현을 몰라도 제품들을 생성할 수 있어, 코드의 확장성과 유지보수성이 향상됨
사용 예: GUI 툴킷, 데이터베이스 연결, 플랫폼별 제품군 등
Last updated