추상 팩토리(Abstract Factory) 패턴
추상 팩토리 (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