팩토리 메서드 패턴
팩토리 메서드 패턴이란
- 구체적으로 어떤 인스턴스를 만들 것인가를 서브 클래스가 정하도록 하는 방법이다.
- 객체 생성에 대한 책임을 서브 클래스에게 넘긴다.
- 클라이언트 코드에서는 객체 생성을 위한 인터페이스만 알고 있으면 된다.
- 객체 생성에 대한 코드가 유연해진다.
- 객체 생성에 대한 코드가 클라이언트 코드로부터 분리된다.
- 가독성이 좋아진다.
- 생성에 대한 책임이 명확해지므로 유지보수에 용이하다.
- 객체 생성에 대한 변동이 있을 경우, 클라이언트 코드에는 손대지 않고 변경이 가능하다.
간단하게 구현하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
abstract class Animal {
abstract void cry();
}
class Dog extends Animal {
@Override
public void cry() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
@Override
public void cry() {
System.out.println("야옹");
}
}
- 위와 같은 생성될 아이템들이 있다고 할 때,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
abstract class AnimalFactory {
abstract Animal createAnimal();
}
class DogFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}
class CatFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat();
}
}
- 객체 생성의 책임을 갖는 팩토리 클래스들이다.
1
2
3
4
5
6
7
// 클라이언트 코드
AnimalFactory dogFactory = new DogFactory();
Animal dog = dogFactory.createAnimal();
dog.cry(); // 멍멍
- 이렇듯 클라이언트 코드에서는 어떤 동물 객체가 생성되었는지 알 필요가 없다.
- 그런데 Dog에서 Cat으로 바꾸려면 결국 클라이언트의 코드가 바뀔 수 밖에 없다.
클라이언트의 책임 더 덜기
클라이언트 코드에서 팩토리 인스턴스를 생성하는 책임도 덜어보자.
1
2
3
4
5
6
7
// 클라이언트 코드
AnimalFactory animalFactory = FactoryGenerator.getAnimalFactory();
Animal animal = animalFactory.createAnimal();
animal.cry();
- 이것처럼 팩토리 생성에 대한 책임을 FactoryGenerator에게 넘겨버렸다.
- 이 코드만 봐선 어떤 팩토리 인스턴스가 들어왔는지, 어떤 동물 인스턴스가 들어왔는지 알 수 없다.
- Spring 같은 프레임워크를 사용해 DI 받는 방법도 있다.
This post is licensed under CC BY 4.0 by the author.