[ 팩토리 메서드(Factory Method) 패턴 ]
: 객체 생성을 Client단에서 하지 않고 별도로 객체를 생성하는 서브클래스(Factory Class)를 만들어 객체를 생성함으로써 결합도를 낮추고 코드 중복을 낮추는 디자인 패턴.
다음 코드는 Client단에서 직접 객체를 생성할 때 발생할 수 있는 문제점을 코드로 나타낸 예시이다.
조건에 따라서, 분기하며 객체를 생성할 경우 아래처럼 if 혹은 switch로 객체를 생성하는대 이때 해당 switch문은 여러군대서 작성될 수 있고
따라서, 객체를 생성할 때마다 중복 코드가 발생할 수 있게 된다.
그뿐만 아니라, 직접 객체를 생성함으로써 결합도도 높아져 클래스 수정시 많은 부분을 수정이 필요하게 된다.
public interface Animal {
public String getName();
}
public class Dog implements Animal{
private String name;
public Dog(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
public class Cat implements Animal {
private String name;
public Cat(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
}
public class Rabbit implements Animal{
private String name;
public Rabbit(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
}
main> main에 있는 switch문 여러군대서 중복되는 문제점 및 testClass와의 결합도가 높아지는 문제점이 있다.
@Test
public void test6() throws Exception {
String objName = "DOG";
Animal obj = null;
switch(objName) {
case "DOG":
obj = new Dog(objName);
break;
case "CAT":
obj = new Cat(objName);
break;
case "RABBIT":
obj = new Rabbit(objName);
break;
default:
break;
}
System.out.println(obj.getName());
}
위의 문제있는 코드를 '팩토리 메서드'패턴을 이용해 수정한 예)
객체를 생성하는 것을 AnimalFactory라는 서브클래스에 위임한다.
public class AnimalFactory {
public static Animal createAnimalObj(String name) { Animal retAnimal = null; switch(name) { case "DOG": retAnimal = new Dog(name); break; case "CAT": retAnimal = new Cat(name); break; case "RABBIT": retAnimal = new Rabbit(name); break; } return retAnimal; }
}
main
@Test
public void test6() throws Exception { **Animal animalObj = AnimalFactory.createAnimalObj(objName);** System.out.println(animalObj.getName()); }
'스터디 > 디자인 패턴(design pattern)' 카테고리의 다른 글
스트레티지 패턴(Strategy Pattern) (0) | 2019.10.16 |
---|---|
스테이트 패턴(State Pattern) (0) | 2019.10.16 |
템플릿 메서드 패턴(Template Method Pattern) (0) | 2019.10.16 |