Ch4. 팩토리패턴 : 객체지향 빵 굽기

‘new’ 연산자의 사용

new를 사용하면 구상 클래스의 인스턴스가 만들어진다.

Duck duck;
if (picnic) {
	duck = new MallardDuck();
} else if(hunting) {
	duck = new DecoyDuck();
} else if (inBathTub) {
	duck = new RubberDuck();
}

위의 코드를 보면 구상 클래스의 인스턴스가 여러 개 있으며, 그 인스턴스의 형식은 실행 시에 주어진 조건에 따라 결정된다는 사실을 알 수 있다.

→ 변경하거나 확장 할 때 코드를 다시 확인하고 새로운 코드를 추가하거나 기존 코드를 제거해야함.

<aside> 💡 새로운 구상 형식을 써서 확장해야 할 때는 어떻게 해서든 다시 열 수 있게 만들어야 한다.

</aside>

인스턴스를 만드는 구상 클래스를 선택하는 법

객체 생성을 처리하는 클래스를 팩토리(Factory) 라고 한다.

→ 일단 SimplePizzaFactory를 만들고 나면 orderPizza() 메소드는 새로 만든 객체의 클라이언트가 된다. 즉, 새로 만든 객체를 호출하는 것.

SimplePizzaFactory 객체 만들기

public class SimplePizzaFactory {
	public Pizza createPizza(String type) {
		Pizza pizza = null;

		if (type.equals("cheese")) {
			pizza = new CheesePizza();
		} else if (type.equals("pepperoni")) {
			pizza = new PepperoniPizza();
		} else if (type.equals("clam")) {
			pizza = new ClamPizza();
		} else if (type.equals("veggie")) {
			pizza = new VeggiePizza();
		}
	}
}

클라이언트 코드 수정하기

public class PizzaStore {
	SimplePizzaFactory factory;

	public PizzaStore(SimplePizzaFactory factory) {
		this.factory = factory;
	}

	public Pizza orderPizza(String type) {
		Pizza pizza;

		pizza = factory.createPizza(type);

		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();

		return pizza;
	}
}

간단한 팩토리

  • 디자인 패턴이라기보다는 프로그래밍에서 자주 쓰이는 관용구에 가깝다.

Untitled

피자가게 프레임워크 만들기

public abstract class PizzaStore {
	public Pizza orderPizza(String type) {
		Pizza pizza;

		pizza = createPizza(type);

		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();

		return pizza;
	}
	
	abstract Pizza createPizza(String type);
}

orderPizza() 메소드는 실제로 어떤 구상클래스에서 작업이 처리되고 있는지 전혀 알 수 없다. 따라서 PizzaStore와 Pizza는 서로 완전히 분리되어 있다.

→ 피자의 종류는 어떤 서브클래스를 선택했느냐에 따라 결정된다.

팩토리 메소드 패턴

모든 팩토리 패턴은 객체 생성을 캡슐화한다.

팩토리 메소드 패턴은 서브클래스에서 어떤 클래스를 만들지 결정함으로써 객체 생성을 캡슐화한다.

<aside> 💡 **팩토리 메소드 패턴(Factory Method Pattern)**에서는 객체를 생성할 때 필요한 인터페이스를 만든다. 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정한다. 팩토리 메소드 패턴을 사용하면 클래스 인스턴스 만드는 일을 서브클래스에서 맡기게 된다.

</aside>

의존성 뒤집기 원칙 (Dependency Inversion Principle)

추상화된 것에 의존하게 만들고 구상 클래스에 의존하지 않게 만든다.

  • 변수에 구상 클래스의 레퍼런스를 저장하지 말자.

  • 구상 클래스에서 유도된 클래스를 만들지 말자.

  • 베이스 클래스에 이미 구현되어 있는 메소드를 오버라이드하지 말자.

추상 팩토리 패턴

💡 추상 팩토리 패턴(Abstract Factory Pattern)은 구상 클래스에 의존하지 않고도 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공한다. 구상 클래스는 서브클래스에서 만든다.

  • 제품군을 만드는 추상 형식을 제공한다. 제품이 생성되는 방법은 이 형식의 서브클래스에서 정의한다.

Last updated