팩토리(Factory) 패턴

1 minute read

팩토리 (Factory) 패턴이란?

팩토리 패턴은 여러 개의 서브 클래스를 가진 슈퍼 클래스가 있을 때 인풋에 따라 하나의 자식 클래스의 인스턴스를 리턴해주는 방식이다.

팩토리 패턴에서는 클래스의 인스턴스를 만드는 시점을 서브 클래스로 미룬다.

이 패턴은 인스턴스화에 대한 책임을 객체를 사용하는 클라이언트에서 팩토리 클래스로 가져온다.


When Used? 또또또 영어 ..

그럼 팩토리 패턴은 언제 사용되는 거지!?

  • 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
  • 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때

뭔 소리여… 역시 예제를 통해서 코드를 봐야 이해가 되겄다.


아래의 예제를 보자

슈퍼클래스와 그 슈퍼클래스를 상속받는 하위클래스

마지막으로 클라이언트의 요청에따라 하위클래스에서 인스턴스를 리턴해주는 팩토리(공장) 을 구현한다.


Super Class - Pet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package CreationalPattern.FactoryPattern;
 
public abstract class Pet {
 
    public abstract String getName();
    public abstract int getAge(); 
 
    @Override
    public String toString() {
        return "NAME = " + this.getName() + ", AGE = " + this.getAge();
    }
 
}
 
cs

SubClass - Dog

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
package CreationalPattern.FactoryPattern;
 
public class Dog extends Pet {
 
    private String name;
    private int age;
 
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}
 
cs

SubClass - Cat

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
package CreationalPattern.FactoryPattern;
 
public class Cat extends Pet {
 
    private String name;
    private int age;
 
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}
 
cs

Cat(고양이) 클래스와 Dog(강아지) 클래스는 모두 Pet(애완동물) 클래스를 상속한다.

다음으로 팩토리(공장) 클래스를 구현한다.

Factory - PetFactory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package CreationalPattern.FactoryPattern;
 
public class PetFactory {
    public static Pet getPet(Anymal type, String name, int age) {
        if ( Anymal.DOG == type ) {
            return new Dog(name, age);
        }
        else if ( Anymal.CAT == type ) {
            return new Cat(name, age);
        }
 
        return null;
    }
 
}
 
cs

Test 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
package CreationalPattern.FactoryPattern;
 
 
public class TestPetFactory {
    public static void main(String[] args) {
        Pet dog = PetFactory.getPet(Anymal.DOG,"로또"7);
        Pet cat = PetFactory.getPet(Anymal.CAT, "토토"2);
 
        System.out.println("Dog : " + dog);
        System.out.println("Cat : " + cat);
    }
}
 
cs

코드를 살펴보면, PetFactory 클래스의 getPet 메소드는 static 메소드로 구현이 되어있으며,

메소드 내부 코드를 보면 Anymal Type 이 Cat이면 Cat 클래스의 인스턴스를, Dog이면 Dog 클래스의 인스턴스를 리턴한다.


이렇게 팩토리 패턴은 처음에 설명했듯이

여러 개의 서브 클래스[Cat, Dog]를 가진 슈퍼 클래스[Pet]가 있을 때 인풋에 따라 하나의 자식 클래스의 인스턴스를 리턴해주는 방식이다

여기에서 계속 Pet의 하위클래스가 생성된다고 해도 getPet()을 통해 인스턴스를 제공받던 Application 코드는 수정이 필요가 없다.

이렇게 OCP (Open Close Principle) 개방 폐쇄원칙를 지킬 수 있다.

OCP (Open Close Principle) - 변경에는 닫혀 있고 확장에는 열려있다

Comments