Post

팩토리 메서드 패턴





팩토리 메서드 패턴이란

  • 구체적으로 어떤 인스턴스를 만들 것인가를 서브 클래스가 정하도록 하는 방법이다.
    • 객체 생성에 대한 책임을 서브 클래스에게 넘긴다.
    • 클라이언트 코드에서는 객체 생성을 위한 인터페이스만 알고 있으면 된다.
    • 객체 생성에 대한 코드가 유연해진다.
  • 객체 생성에 대한 코드가 클라이언트 코드로부터 분리된다.
    • 가독성이 좋아진다.
    • 생성에 대한 책임이 명확해지므로 유지보수에 용이하다.
    • 객체 생성에 대한 변동이 있을 경우, 클라이언트 코드에는 손대지 않고 변경이 가능하다.



간단하게 구현하기

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.