SMALL

Abstract Factory Pattern

추상 팩토리 패턴은 큰 규모의 객체 군을 형성하는 생성 패턴이다.

팩토리 메서드 패턴을 확장한 패턴이라고 생각할 수 있다.

출처: https://johngrib.github.io/wiki/abstract-factory-pattern/#fnref:structure

추상 팩토리는 여러 개의 팩토리 메서드를 그룹으로 묶은 것과 유사하다.

추상 팩토리는 다양한 객체 생성 과정에서 그룹화가 필요할 때 매우 유용한 패턴이며 공장의 개념을 추상화한 것이다. ( 팩토리 메서드는 추상 팩토리와 동일하게 추상화 과정을 적용할 수 있지만 단일 그룹으로 제한한다.) 

 

각각의 그룹은 해결해야 하는 문제에 따라서 형성됩니다.

문제가 다양할 경우 새로운 객체를 생성해 그룹을 추가합니다. 

 

추상 팩토리는 생성 패턴을 그룹화된 구조로 분리합니다.

추상 클래스를 상속받는 하위 클래스를 추가해 새로운 그룹을 쉽게 만들 수 있지만 그룹의 하위 클래스를 추가하는 것은 쉽지 않습니다. 

( 위의 그림을 예시로 설명하면 새로운 그룹 -> ConcreteFactory1,2 && 그룹의 하위 클래스-> AbstractProductA, B )

 

AbstractFactory, ConcreteFactory

public abstract class Factory {
	
	abstract public TireProduct createTire();
	abstract public DoorProduct createDoor();
}

public class KoreaFactory extends Factory{

	@Override
	public TireProduct createTire() {
		return new KoreaTireProduct();
	}

	@Override
	public DoorProduct createDoor() {
		return new KoreaDoorProduct();
	}

}

public class StateFactory extends Factory{

	@Override
	public TireProduct createTire() {
		return new StateTireProduct();
	}

	@Override
	public DoorProduct createDoor() {
		return new StateDoorProduct();
	}

}

 

AbstractProduct, ConcreteProduct

public abstract class DoorProduct {
	abstract public String makeAssemble();
}

public class KoreaDoorProduct extends DoorProduct{

	@Override
	public String makeAssemble() {
		return "korea door product";
	}

}

public class StateDoorProduct extends DoorProduct{

	@Override
	public String makeAssemble() {
		return "state door product";
	}

}

 

public abstract class TireProduct {
	abstract public String makeAssemble();
}

public class KoreaTireProduct extends TireProduct{

	@Override
	public String makeAssemble() {
		return "korea tire product";
	}

}

public class StateTireProduct extends TireProduct{

	@Override
	public String makeAssemble() {
		return "state tire product";
	}

}

 

이제 각각의 클래스들은 정의가 되었고, 해당 클래스들을 호출하는 코드를 보자 

public class Main {
	public static void main(String[] args) {
		Factory factory = new KoreaFactory();
		TireProduct tire = factory.createTire();
		DoorProduct door = factory.createDoor();
		
		System.out.println(tire.makeAssemble());
		System.out.println(door.makeAssemble());
		
		factory = new StateFactory();
		tire = factory.createTire();
		door = factory.createDoor();
		
		System.out.println(tire.makeAssemble());
		System.out.println(door.makeAssemble());
		
	}
}

 

패턴의 장단점

앞에 살펴본 예제에서 각 그룹에 새로운 부품인 Engine을 추가해야 한다고 가정해봅시다.

새로운 부품을 추가할 때는 추상 클래스 그룹으로 분리된 모든 클래스에 Engine 부품 관련 코드를 삽입해야 합니다. 

추상 클래스의 경우 그룹을 나누는 것은 쉽지만 서브 생성 객체를 추가하는 것은 어렵습니다.

 

장점

  • 추상 팩토리의 그룹은 동일한 처리 로직을 갖고 있고, 다른 그룹으로 변경돼도 하위 클래스를 통해 선택적 객체를 다르게 생성할 수 있다
  • 추상 팩토리는 큰 변화 없이 시스템의 군을 생성하고 변경할 수 있다.

단점

  • 새로운 종류의 군을 추가하는 것이 쉽지 않다.
    ( 기존 군에서 새로운 군을 추가하여 확장할 때 모든 서브 클래스들이 동시에 변경돼야 한다)
  • 추상 팩토리는 팩토리 메서드와 비슷하지만 관리할 그룹이 많다 
    ( 계층의 크기가 커질수록 복잡한 문제가 발생 )

 

LIST

+ Recent posts