추상 팩토리(Abstract Factory) 패턴

1 minute read

추상 팩토리 (Abstract Factory) 패턴이란?

추상 팩토리 패턴은 팩토리 패턴과 유사한 패턴으로 팩토리 메소드 패턴에서는 하나의 팩토리 클래스가 인풋으로 들어오는 값에 따라 if-else나 switch 문을 사용하여 다양한 서브클래스를 리턴하는 형식이었는 **반면, 추상 팩토리 패턴에서는 팩토리 클레스에서 서브 클래스를 생성하는데 있어 **

if-else나 swtich문을 걷어내고 인풋으로 또 하나의 팩토리 클래스를 받는다.

아래의 예제를 보자.

젠장 사실 처음에 예제를 만들 때 뭘로 하면 좋을까 하다가 Pet을 생각해냈지만 아무래도 펫 공장이라는 느낌이 들어 별로이긴하지만 오해하지말고 예제는 예제로만 느끼자.


super class - Pet

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

sub class - 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.AbstractFactoryPattern;
 
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

sub class - 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.AbstractFactoryPattern;
 
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

이전 블로그를 보면 알겠지만 위 코드는 사실 팩토리 메서드 패턴과 같다.

아래서부터 추상 팩토리의 역할을 하는 추상 클래스 또는 인터페이스가 추가 되면서 차이가 생긴다.

1
2
3
4
5
6
package CreationalPattern.AbstractFactoryPattern;
 
public abstract class PetAbstractFactory {
    abstract Pet createPet();
}
 
cs

PetAbstractFactory 클래스의 메소드 createPet는 super class 인 Pet을 리턴한다.

이제 아래에서는 각각의 Pet을 상속받고 있는 Sub class를 위한 Factory class를 생성하여

PetAbstractFactory 클래스를 상속받아 추상메소드를 각각 구현 할 것이다.

DogFactory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package CreationalPattern.AbstractFactoryPattern;
 
public class DogFactory extends PetAbstractFactory {
 
    private String name;
    private int age;
 
    public DogFactory(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public Pet createPet() {
        return new Dog(name, age);
    }
}
 
cs

CatFactory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package CreationalPattern.AbstractFactoryPattern;
 
public class CatFactory extends PetAbstractFactory {
 
    private String name;
    private int age;
 
    public CatFactory(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public Pet createPet() {
        return new Cat(name,age);
    }
}
 
cs

이렇게 두개의 sub class [dog, cat]에 대한 Factory 클래스를 구현했다.

이제 이 서브 클래스들을 생성하기 위한 클라이언트 코드에 접점으로 제공하는 consumer 클래스를 만든다.

1
2
3
4
5
6
7
8
package CreationalPattern.AbstractFactoryPattern;
 
public class PetFactory {
   static Pet getPet(PetAbstractFactory factory) {
      return factory.createPet();
   }
}
 
cs

PetFactory클래스는 위에서 메소드 인자로 PetAbstractFactory 추상 클래스를 받고, getPet 메소드는 인자로 받은 factory 추상클래스의 createPet 메소드를 실행한다.

PetAbstractFactory 를 상속받고 있는 클래스는 DogFactory, CatFactory 이므로 두가지 종류가 메소드 인자로 올 수 있다.

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

Comments