- 객체를 사용하는 코드에서 객체의 생성 부분을 뗴어놓고 추상화한 패턴
- 상속관계의 두 클래스에서 상위 클래스가 큰 뼈대를 구성하고
- 하위 클래스는 객체 생성에 관한 내용을 결정하는 패턴
- 상위 클래스와 하위 클래스의 분리로 느슨한 결합
- 하위 클래스만이 인스턴스 생성을 담당하고 있기에 상위 클래스는 인스턴트 생성 방식에 알 필요가 없어서 유연성 증가
- 객체를 생성하는 로직이 따로 있기 때문에 리팩터링시 한 곳만 고치면 돼 유지보수성의 증가
팩토리 패턴은 말 그래도 공장처럼 찍어낸다는 의미이다.
피자의 레시피, 파스타의 레시피가 하위 클래스에서 정의되고 있고,
상위 클래스에선 그 레시피에 따라 생산을 하는 기능을 한다고 볼 수 있다.
이를 그림으로 표현하면 아래와 같다
package FactoryPattern;
import static FactoryPattern.List.PASTA;
import static FactoryPattern.List.PIZZA;
abstract class Menu {
public abstract int getPrice();
@Override
public String toString() {
return "This menu is " + this.getPrice();
}
}
class MenuFactory {
public static Menu getCoffee(String type, int price) {
if (PASTA.toString().equalsIgnoreCase(type)) return new Pasta(price);
else if (PIZZA.toString().equalsIgnoreCase(type)) {
return new Pizza(price);
} else {
return new DefaultMenu();
}
}
}
class DefaultMenu extends Menu {
private int price;
public DefaultMenu() {
this.price = -1;
}
@Override
public int getPrice() {
return this.price;
}
}
class Pasta extends Menu {
private int price;
public Pasta(int price) {
this.price = price;
}
@Override
public int getPrice() {
return this.price;
}
}
class Pizza extends Menu {
private int price;
public Pizza(int price) {
this.price = price;
}
@Override
public int getPrice() {
return this.price;
}
}
public class HelloWorld {
public static void main(String[] args) {
Menu pasta = MenuFactory.getCoffee("Pasta", 11000);
Menu pizza = MenuFactory.getCoffee("Pizza", 20000);
System.out.println("Factory Pasta:: " + pasta);
System.out.println("Factory Pizza:: " + pizza);
}
}
//출력
//Factory Pasta:: This menu is 11000
//Factory Pizza:: This menu is 20000
위의 코드에서 볼 수 있는 것과 같이 모든 팩토리패턴에서는 객체 생성을 "캡슐화"한다.
이러한 팩토리 패턴은 주로 제품 생산군에서 많이 사용되는 디자인 패턴이다.
중요한 것은 의존성 뒤집기 원칙이다.
간단히 말해 "추상화된 것에 의존하도록 만들어라. 구상 클래스에 의존하도록 만들지 않도록 한다."는 것이다.
구상 클래스는 캡슐화된 객체 생성 로직을 말한다. 위의 코드는 이러한 의존성 뒤집기 원칙을 자세히 다룰 수 없기에
이에 대하여 추후 블로그에 작성해보도록 하겠다.