Search

Factory Pattern

개요

팩토리 패턴은 간단하게 말하자면
객체 생성을 공장(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
복사
ProductFactorycreateProduct 메서드의 파라미터에 전달하여 객체를 생성한다.
심플 팩토리 패턴은 단순히 객체를 만드는 작업을 하나의 팩토리 클래스에 모아놓는 것을 말한다.

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) 택배박스, 스티로폼 박스 등…