[JAVA]디자인패턴-3.Factory

Factory Method패턴

factory는 객체를 찍어내는 공장으로 생각하면 된다.
객체 선언은 보통 new 객체() 이렇게 하지만 factory는 내부에서 그런 일을 해준다.
즉 factory를 가져다가 쓰는 부분에서는 new 객체()와 같은 식으로 변수를 선언할 필요가 없다.
객체를 만들어내는 부분을 서브 클래스Sub-Class에 위임하는 패턴.
즉, new 키워드를 호출하는 부분을 서브 클래스에 위임하는 것이다.
결국 팩토리 메소드 패턴은 객체를 만들어내는 공장(Factory 객체)을 만드는 패턴이라 이해하면 된다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public interface Animal {
public void printDescription();
}
public class AnimalFactory {
public static Animal create(String animalName){
if (animalName == null) {
throw new IllegalArgumentException("null은 안 되지롱~");
}
if (animalName.equals("소")) {
return new Cow();
}else if (animalName.equals("고양이")) {
return new Cat();
}else if (animalName.equals("개")) {
return new Dog();
}else{
return null;
}
}
}

public class Cat implements Animal {
public void printDescription() {
System.out.println("쥐잡기 선수");
}
}
public class Cow implements Animal {
public void printDescription() {
System.out.println("우유 및 고기 제공");
}
}
public class Dog implements Animal {
public void printDescription() {
System.out.println("주로 집 지킴");
}
}
public class Test {
public static void main(String[] args) {
Animal a1= AnimalFactory.create("소");
a1.printDescription();
Animal a2= AnimalFactory.create("고양이");
a2.printDescription();
Animal a3= AnimalFactory.create("개");
a3.printDescription();
}
}

일단 Animal이라는 인터페이스가 있고 Cat, Cow, Dog 이라는 인터페이스의 구현체들이 있다..
그리고 AnimalFactory가 있는데, 여기서 Animal의 구현체를 돌려준다.
Test에서 new Cow()와 같이 하지 않고, AnimalFactory.create(“소”)를 호출하는 게 일반적인 방법과의 차이다.

Factory 의 유용성

Animal a1 = AnimalFactory.create(“소”); 와 같은 코드에서 a1이 Cow라는 것을 굳이 신경쓰지 않겠다는 것이다. Test클래스 안에는 new 라는 구문 자체가 없다.
정확히 어떤 클래스의 인스턴스인지 신경쓰지 않고 구현할 수 있는 장점이 있다. 객체 타입이 굉장히 유연해 질 수 있다는 뜻이다.
팩토리 메소드 패턴을 사용하는 이유는 클래스간의 결합도를 낮추기 위한 것이다. 결합도라는 것은 간단히 말해 클래스의 변경점이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가를 뜻하는데, 팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거한다. 결과적으로 결합도 또한 낮출 수 있게 된다.

Factory Method의 종류

예제에서는 Factory의 인스턴스를 만들지 않고, static 메쏘드인 create()만을 호출 하였다. 이런 방식을 static factory method라고 한다.
그냥 factory method라고 하면, factory의 인스턴스를 만들어서 쓰는 방식을 말한다.
static factory에 비해 사용 빈도는 좀 떨어지지만, factory의 인스턴스에 귀속되는 객체를 생성해야 할 때는 이런 방식을 사용한다.