정의
•
객체의 생성 로직을 캡슐화하여 추상화하는 생성 디자인 패턴
•
코드에서 구체적인 객체 생성 방식을 직접 다루는 대신, 공장(Factory) 역할을 하는 객체를 통해 필요한 객체를 생성하도록 설계한다.
•
객체를 생성하는 코드와 사용하는 코드를 분리하여, 객체의 생성을 한 곳에서 관리하고, 코드의 유연성과 재사용성을 높이는 데 도움이 된다.
종류
•
Simple Factory : 단일 Concrete Factory를 사용하는 간단한 Factory 패턴
•
Factory Method : 추상 Factory 메서드를 통해 Concrete Factory를 선택하는 Factory 패턴
•
Abstract Factory : 제품군을 생성하기 위한 추상 Factory 인터페이스를 제공하는 패턴
주요 구성 요소
•
Factory 인터페이스 : 객체 생성을 위한 추상 메서드를 정의
◦
Concrete Factory가 구현해야 하는 메서드를 선언
◦
Client는 Factory 인터페이스를 통해 Factory 객체를 사용
•
Concrete Factory : Factory 인터페이스를 구현하며, 실제 객체 생성 과정을 수행
◦
각 Concrete Factory는 특정 유형의 객체를 생성
◦
Client는 Concrete Factory 객체를 직접 사용하지 않는다.
•
Product 인터페이스 : 생성된 객체가 구현해야 하는 공통 인터페이스를 정의
◦
Concrete Product가 구현해야 하는 메서드를 선언
◦
Client는 Product 인터페이스를 통해 생성된 객체를 사용
•
Concrete Product : Product 인터페이스를 구현
◦
Concrete Factory에서 생성된 실제 객체
◦
각 Concrete Product는 특정 유형의 기능을 제공
•
Client : Factory 객체를 사용하여 필요한 객체를 생성
◦
Factory 인터페이스를 통해 Factory 객체와 상호 작용한다.
◦
Concrete Factory 객체를 직접 사용하지 않는다.
◦
생성된 객체를 사용하여 작업을 수행
작동방식
1.
Client는 Factory 객체를 생성
2.
Client는 Factory 객체의 메서드를 호출하여 필요한 객체를 생성하도록 요청
3.
Factory 객체는 Concrete Factory 객체를 선택하여 실제 객체 생성 과정을 수행
4.
Concrete Factory 객체는 요청에 맞는 객체를 생성하여 Factory 객체에 반환
5.
Factory 객체는 생성된 객체를 Client에게 반환
장점
•
코드 간결화 : 객체 생성 과정을 캡슐화하여 코드를 간결하게 만들 수 있다.
•
유연성 향상 : 새로운 객체 생성 방식을 추가하거나 변경하기 쉽다.
•
결합도 감소 : Client는 구체적인 객체 생성 방식에 의존하지 않는다.
•
확장성 향상 : 새로운 Concrete Factoy 객체를 추가하여 새로운 객체를 쉽게 생성할 수 있다.
•
테스트 용이성 : 객체 생성 과정을 모킹(Mocking)하여 테스트하기 쉽다.
단점
•
추가적인 객체 생성 : Factory 객체와 Concrete Factory 객체가 추가적으로 생성되어 오버헤드가 발생할 수 있다.
•
추상화 수준 증가 : 코드의 추상화 수준이 증가하여 이해하기 어려워질 수 있다.
사용 예시
•
GUI 프레임워크 : 위젯 생성을 위한 Factory 패턴을 제공
•
문서 처리 시스템 : 다양한 문서 형식을 생성하기 위한 Factory 패턴을 제공
•
데이터베이스 연결 : 다양한 데이터베이스에 연결하기 위한 Factory 패턴을 제공
사용법
1. Factory 인터페이스 정의
•
객체 생성을 위한 추상 메서드를 정의
•
Concrete Factory가 구현해야 하는 메서드를 선언
•
Client는 Factory 인터페이스를 통해 Factory 객체를 사용
public interface Factory {
// 객체 생성을 위한 추상 메서드를 정의
Product createProduct();
}
Java
복사
2. Concrete Factory 구현
•
Factory 인터페이스를 구현
•
실제 객체 생성 과정을 수행
•
각 Concrete Factory는 특정 유형의 객체를 생성
•
Client는 Concrete Factory 객체를 직접 사용하지 않는다.
public class ConcreteFactory1 implements Factory {
@Override
public Product createProduct() {
return new Product1();
}
}
public class ConcreteFactory2 implements Factory {
@Override
public Product createProduct() {
return new Product2();
}
}
Java
복사
3. Product 인터페이스 정의
•
생성된 객체가 구현해야 하는 공통 인터페이스를 정의
•
Concrete Product가 구현해야 하는 메서드를 선언
•
Client는 Product 인터페이스를 통해 생성된 객체를 사용
public interface Product {
void doSomething();
}
Java
복사
4. Concrete Product 구현
•
Product 인터페이스를 구현
•
Concrete Factory에서 생성된 실제 객체
•
각 Concretr Product는 특정 유형의 기능을 제공
public class Product1 implements Product {
@Override
public void doSomething() {
System.out.println("Product1 doSomething");
}
}
public class Product2 implements Product {
@Override
public void doSomething() {
System.out.println("Product2 doSomething");
}
}
Java
복사
5. Client 코드 작성
•
Factory 객체를 생성
•
Factory 객체의 메서드를 호출하여 필요한 객체를 생성하도록 요청
•
생성된 객체를 사용하여 작업을 수행
public class Client {
public static void main(String[] args) {
Factory factory1 = new ConcreteFactory1();
Product product1 = factory1.createProduct();
product1.doSomething();
Factory factory2 = new ConcreteFactory2();
Product product2 = factory2.createProduct();
product2.doSomething();
}
}
Java
복사