개요
팩토리 패턴은 간단하게 말하자면
객체 생성을 공장(Factory) 클래스로 캡슐화 하여 생성을 위임하는 디자인 패턴이다.
클래스의 인스턴스를 만드는 시점 자체를 서브 클래스로 미루는 것이다.
즉, new 연산자 를 통해 객체를 생성하는 것이 아닌 공장 클래스의 메서드에서 객체 생성을 하는 것이다.
팩토리 패턴은 심플 팩토리 패턴, 팩토리 메서드 패턴, 추상 팩토리 패턴 세 가지로 나눌 수 있다.
팩토리 패턴 종류
1. 심플 팩토리 패턴
심플 팩토리 패턴은 단순히 객체를 생성하는 클래스를 따로 두는 것이다.
public class ProductFactory {
private Product createProduct(Integer typeEnum) {
return switch(typeEnum) {
case ProductTypeEnum.NORMAL -> new NormalProduct();
case ProductTypeEnum.SPECIAL -> new SpecialProduct();
default -> null;
};
}
}
public interface Product {
void explain();
}
public class NormalProduct implement Product {
@Override
public void explain() {
System.out.println("나는 일반 상품입니다.");
}
}
public class SpecialProduct implement Product {
@Override
public void explain() {
System.out.println("나는 특별 상품입니다.");
}
}
public static void main(String[] args) {
ProductFactory productFactory = new ProductFactory();
Product product = productFactory.createProduct(ProductTypeEnum.NORMAL);
product.explain();
}
// console
// 나는 일반 상품입니다.
Java
복사
ProductFactory 의 createProduct 메서드의 파라미터에 전달하여 객체를 생성한다.
심플 팩토리 패턴은 단순히 객체를 만드는 작업을 하나의 팩토리 클래스에 모아놓는 것을 말한다.
2. 팩토리 메서드 패턴
•
ProductFacotry : 이 인터페이스는 팩토리를 인터페이스로 정의하고 서브 클래스에서 객체 생성 메서드를 구현하도록 함.
•
AProductFactory : 팩토리 인터페이스를 상속받은 서브 팩토리 클래스이다.
각 서브 팩토리 클래스에 맞는 Product를 생성한다.
•
Product : 제품 구현체를 추상화
•
ProductA : 제품 구현체
AProductFactory aProductFactory = new AProductFactory();
Product product = aProductFactory.createProduct();
product.explain();
// console
// 나는 A 상품입니다.
Java
복사
팩토리 매서드 패턴은 클래스의 인스턴스를 만드는 일을 팩토리 인터페이스의 서브 클래스에 맡기는 것이다.
장점
팩토리 메서드 패턴으로 가져갈 수 있는 이점은 다음과 같다.
•
추상화, 캡슐화를 통해 생성되는 객체의 구체적인 타입을 은닉할 수 있다.
→ 객체 생성을 별도의 클래스로 분리하기 때문에 단일 책임 원칙을 준수한다. (생성자와 구현체의 강한 결합을 피할 수 있다)
→ 새로운 제품 종류가 늘어나면 기존 코드의 변경 없이 새로운 클래스를 만들면 되기 때문에 OCP(개방 폐쇄 원칙)을 준수한다.
단점
•
거의 모든 디자인 패턴이 그렇듯이 클래스의 수가 늘어난다…
•
코드 복잡성이 증가한다.
팩토리 패턴의 장점에도 불구하고 제품의 종류가 하나 늘어날때마다 구현체 + 서브 팩토리 최소 두 개의 클래스가 늘어나기 때문에
팩토리 패턴을 신중하게 적용하여야 한다.
그렇다면 팩토리 패턴은 언제 써야할까?
팩토리 패턴을 고려해야 하는 경우
•
클래스의 생성과 사용의 처리 로직을 분리하여 결합도를 낮추고자 할 때
◦
음… 이 케이스는 아직 피부로 느껴지지 않는다.
•
라이브러리 혹은 프레임워크 사용자에게 구성요소 확장방법을 제공할려는 경우
•
코드가 동작해야 하는 객체의 타입을 캡슐화를 통해 은닉해야 할 경우
◦
이 경우는 솔루션이나 라이브러리 제공할때 해봤다….
3. 추상 팩토리 패턴
추상 팩토리 패턴은 하나의 Factory에서 여러개의 제품을 조합하여 생성할 수 있게 해주는 패턴이다.
위의 예제로 말하자면 현재 ProductFactory에서 하나의 Product만 생성하여 반환하지만 만약 포장지? 같은 것도 함께 만들어서 생성할 수 있다. ex) 택배박스, 스티로폼 박스 등…