Factory Pattern (a.k.a Factory class)

Factory Class란?
객체 생성의 책임을 가지고 있는 class이다.
*정확히는 Design Pattern은 아니다.

Factory 패턴을 이해하기 위해 예시를 가지고 왔다.

피자 가게를 운영한다고 가정해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Pizza orderPizza(String type){
Pizza pizza;
if (type.equals("cheese"){
pizza = new CheesePizza();
})
if (type.equals("greek"){
pizza = new GreekPizza();
})
if (type.equals("pepperoni"){
pizza = new Pepperoni();
})
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}

고객으로부터 주문을 받아, 피자 객체를 만든다고 하면 피자 타입에 따라 다른 객체를 생성해주어야 할 것이다.

위 코드에서 변경되는 부분은 객체를 생성하는 부분으로, 별도로 캡슐화할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SimplePizzaFactory{
public Pizza createPizza(String type){
Pizza pizza=null;
if (type.equals("cheese"){
pizza = new CheesePizza();
})
if (type.equals("greek"){
pizza = new GreekPizza();
})
if (type.equals("pepperoni"){
pizza = new Pepperoni();
})
return pizza;
}
}

이처럼 객체를 생성해주는 class를 Factory라고 부른다.

사실 Factory Pattern은 엄밀히 말하면 디자인 패턴은 아니라고 한다.

어쨌거나 이렇게 객체를 생성하는 책임을 Factory Class로 캡슐화하였을때 어떤 장점이 있을까?

  1. 여러 Client에서 사용이 가능하다.
  2. 객체 생성의 책임이 Factory class로 분리되었음으로 객체 생성관련하여 변경이 생겼을때는 한 곳만 수정하면 된다.

여기서 effective Java Item5 내용을 추가하면


"Item5. 자원을 직접 명시하지 말고, DI를 통해 객체를 주입받자"
최종적으로 수정된 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class PizzaStore{
SimplePizzaFactory factory;

// 생성자를 통해 Factory 를 주입받는다.
public PizzaStore(SimplePizzaFactory factory){
this.factory = factory;
}
// 객체 생성의 책임은 Factory Class에 있다. Client는 단지 이를 이용하여 원하는 인스턴스를 만들어 낸다.
public Pizza orderPizza(String type){
Pizza pizza;
pizza = factory.createPizza(type);

pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}
  • Reference
  1. Head First Design Patterns: A Brain-Friendly Guide (Head First Design Patterns: A Brain-Friendly Guide)

Comments