1. 팩토리 메소드 패턴이란?
객체를 생성하기 위한 인터페이스를 정의하고, 어떤 클래스의 인스턴스를 생성할지에 대한 처리는 서브클래스가 결정하는 디자인 패턴
- GoF
2. 팩토리 메소드 패턴을 사용하는 이유
팩토리 메소드 패턴을 사용하는 이유는 클래스의 생성과 사용의 처리로직을 분리하여 결합도를 낮추기 위한 것 입니다.
결합도는 간단히 말해서 클래스의 처리 로직에 대한 변경점이 생겼을 때 얼마나 사이드 이펙트를 주는가 인데, 팩토리 메소드 패턴을 사용할 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 생성 로직을 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거 합니다.
3. 팩토리 메소드 패턴 예제
1) 음료수의 추상 클래스
public abstract class Drink {
abstract public String info();
}
음료수의 베이스가 되는 추상클래스입니다. 모든 음료수는 info() 메소드를 오버라이딩해야 합니다.
2) 음료수 클래스
public class Coffee extends Drink {
@Override
public String info() {
return "커피 맛";
}
}
public class Coke extends Drink {
@Override
public String info() {
return "콜라 맛";
}
}
public class Tejava extends Drink {
@Override
public String info() {
return "크래파스 맛";
}
}
Drink 추상 클래스를 상속받는 음료수 클래스입니다. 각 클래스는 info() 메소드를 오버라이딩합니다.
3) 음료수 타입 (enum)
public enum DrinkType {
Coke, Coffee, Tejava
}
음료수 타입은 enum으로 지정했습니다.
4) Factory Class
public abstract class DrinkFactory {
abstract Drink create(DrinkType drinkType);
}
//factory class
public class VendingMachine extends DrinkFactory {
@Override
public Drink create(DrinkType drinkType) {
switch (drinkType) {
case Coffee:
return new Coffee();
case Coke:
return new Coke();
case Tejava:
return new Tejava();
default:
throw new RuntimeException(drinkType.toString() + " is not existed");
}
}
}
DrinkFactory 클래스의 서브 클래스인 VendingMachine 클래스에서 create() 메소드를 오버라이딩합니다.
create 메소드의 파라미터로 drinkType을 전달받아 Drink 객체를 생성합니다.
5) Main
public class Main {
public static void main(String[] args) {
DrinkFactory drinkFactory = new VendingMachine();
Drink drink1 = drinkFactory.create(DrinkType.Coffee);
Drink drink2 = drinkFactory.create(DrinkType.Tejava);
System.out.println(drink1.info());
System.out.println(drink2.info());
}
}
create 메소드에 DrinkType enum을 파라미터로 전달해 Drink 객체를 생성합니다.
6) 결과
커피 맛
크래파스 맛
참조 :
jdm.kr/blog/180
johngrib.github.io/wiki/factory-method-pattern/
'IT > 디자인 패턴' 카테고리의 다른 글
[Design Pattern] 데코레이터 패턴 (Decorator Pattern) (0) | 2020.10.28 |
---|---|
[Design Pattern] 추상 팩토리 패턴(Abstract factory pattern) (0) | 2020.10.27 |
[디자인 패턴] 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.10.16 |
[디자인 패턴] 프록시 패턴 (Proxy Pattern) (0) | 2020.10.15 |
[디자인 패턴] 컴포지트 패턴(Composite pattern) (0) | 2020.10.14 |