팩토리 메소드 패턴(Factory Method Pattern)
- 팩토리 메소드 패턴은 생성패턴(Creational Pattern) 중 하나이다.
- 생성 패턴은 인스턴스를 만드는 절차를 추상화하는 패턴이다.
- 생성 패턴에 속하는 패턴들은 객체를 생성, 합성하는 방법이나 객체의 표현방법을 시스템과 분리해준다.
장점
- 확장에 열려있고 변경에 닫혀있는 객체 지향 원칙을 적용해서 기존에 인스턴스를 만드는 과정의 로직을 건드리지 않고, 새로운 인스턴스를 다은 방법으로 확장이 가능하다.
- 팩토리 메소드 패턴은 클라이언트 코드로부터 서브 클래스의 인스턴스화를 제거하여 서로 간의 종속성을 낮추고, 결합도를 느슨하게 하며(Loosely Coupled), 확장을 쉽게 한다.
- 팩토리 메소드 패턴은 클라이언트와 구현 객체들 사이에 추상화를 제공한다.
단점
- 각자의 역할을 나누어서 생성하다 보니 클래스 개수가 늘어난다.
코드
* 부동산 중개 수수료 계산 프로그램 가정(매매/임대차)
- 중개 정책 interface 생성 :
interface를 구현하는 하위 클래스에서 수수료 계산 로직을 구현한다.
java8 이후로 default 메소드를 사용하면 interface 내부에서 로직 작성이 가능하다. (default 명시)
java9 이후로는 interface에 priave 메소드도 사용이 가능하다.
public interface BrokeragePolicy {
BrokerageRule createBrokerageRule(Long price);
default Long calculate(Long price) {
BrokerageRule rule = createBrokerageRule(price);
return rule.calcMaxBrokerage(price);
}
}
- 매매 중개 수수료 class :
java7 이후부터 _는 숫자 리너털 어디에도 사용할 수 있다. 가독성 향상
public class PurchaseBrokeragePolicy implements BrokeragePolicy{
public BrokerageRule createBrokerageRule(Long price) {
BrokerageRule rule;
if(price < 50_000_000) {
rule = new BrokerageRule(0.6, 250_000L);
} else if(price < 200_000_000) {
rule = new BrokerageRule(0.5, 800_000L);
}else if(price < 600_000_000) {
rule = new BrokerageRule(0.4, null);
}else if(price < 900_000_000) {
rule = new BrokerageRule(0.5, null);
}else{
rule = new BrokerageRule(0.9, null);
}
return rule;
}
}
- 임대차 중개 수수료 class
public class RentBrokeragePolicy implements BrokeragePolicy{
public BrokerageRule createBrokerageRule(Long price) {
BrokerageRule rule;
if(price < 50_000_000) {
rule = new BrokerageRule(0.5, 200_000L);
} else if(price < 100_000_000) {
rule = new BrokerageRule(0.4, 300_000L);
}else if(price < 300_000_000) {
rule = new BrokerageRule(0.3, null);
}else if(price < 600_000_000) {
rule = new BrokerageRule(0.4, null);
}else{
rule = new BrokerageRule(0.8, null);
}
return rule;
}
}
- Factory Class (핵심 클래스)
public class BrokeragePolicyFactory {
public static BrokeragePolicy of(ActionType actionType) {
switch (actionType) {
case RENT:
return new RentBrokeragePolicy();
case PURCHASE:
return new PurchaseBrokeragePolicy();
default:
throw new IllegalArgumentException("해당 actionType에 대한 정책이 존재하지 않습니다.");
}
}
}
- 중개 수수료 계산 api
public Long calcBrokerage(@RequestParam ActionType actionType,
@RequestParam Long price) {
// 타입 정의 - 매매 / 임대차
BrokeragePolicy policy = BrokeragePolicyFactory.of(actionType);
return policy.calculate(price);
}
실무 사용 사례
- Spring에서 BeanFactory
- Java Calendar
'JAVA > Design Pettern' 카테고리의 다른 글
[Design Pattern] 프록시 패턴 (0) | 2022.03.22 |
---|---|
[Design Pattern] 추상 팩토리 패턴 (0) | 2022.03.19 |
[Design Pattern] 어댑터 패턴 (0) | 2022.03.16 |
[Design Pattern] 싱글톤 패턴 (0) | 2022.03.15 |
[Design Pattern] 빌더 패턴 (0) | 2022.03.14 |