팩토리 메소드 패턴 (Factory method)

Min Kyu Jeon·2022년 11월 30일
0

GoF의 디자인 패턴에서 언급되는 패턴 중 하나로,
객체 생성과 관련된 디자인 패턴이다.

확장에는 열려있고 변경에는 닫혀있을 수 있다는 특징이 있다. → 이 말이 무엇인가 확인해보자!

자동차 공장을 프로그래밍 해야 한다. ( Simple Factory )
여기서 언급된 Simple Factory 패턴은 디자인 패턴의 종류는 아니나 OOP에서 자주 쓰이는 관용구

자동차 공장 코드

public class CarFactory {
	public static Car orderCar(String model, String orderUser) {
		modelValidation(model);
		userValidation(orderUser);	
		return makeCar(model,orderUser);
	}

	private static void modelValidation(String model){
		// validation 생략..	
	}
	private static void userValidation(String orderUser){
		// validation 생략..	
	}
	private static car makeCar(String model, String orderUser) {
		// 자동차 엔진, 연료통, 바디 등등 조립 과정 생략
		// 내연기관 자동차 
		return new Car(model,orderUser);
	}
}

클라이언트 코드

public class Client {
    public static void main(String[] args) {
        Car myCar = CarFactory.orderCar("k5", "minkyu");
        System.out.println(myCar);
    }
}

세상이 발전하였고 나는 전기차도 생산하고 싶다!
How to? → 기존 CarFactory의 makeCar 메소드 안에서 분기처리를 한다

public class CarFactory {
	// ...
	private static car makeCar(String model, String orderUser) {
		if( model == "k5" ){
			// 엔진 장착
			return new EngineCar(model,orderUser);
		} else if( model == "ev6"){
			// 모터 장착
			return new EvCar(model,orderUser);
		}
	}
}

⇒ 나중에 수소차, LPG차 등등 추가될때마다 CarFactory를 수정해야 되는 구조! → 점점 복잡해짐…

To Be Factory method

팩토리 메소드 패턴으로 코드를 짠다면 다음과 같이 작성할 수 있다.

public interface CarFactory {
	default Car orderCar(String model, String orderUser) {
		modelValidation(model);
		userValidation(orderUser);	
		return makeCar(model,orderUser);
	}

	Car makeCar(String model, String orderUser); // 선언**

	private void modelValidation(String model){
		// validation 생략..	
	}
	private void userValidation(String orderUser){
		// validation 생략..	
	}
}
public class EngineCarFactory implements CarFactory {
	@Override
	public Car makeCar() {
		return new EngineCar();
	}
}

이러한 상황에서 전기차를 추가한다고 한다면, 기존 코드의 수정 없이 CarFactory 구현체인 EvCarFactory만 작성하면 되는것이다.

public class EvCarFactory implements CarFactory {
	@Override
	public Car makeCar() {
		return new EvCar();
	}
}

팩토리 메소드 패턴의 장단점

장점

기능의 확장에는 열려있으나 기존 코드 수정은 하지 않아도 된다 !
→ 확장에는 열려있고 변경에는 닫혀있다.

인스턴스를 생성하는 과정에서 기존의 코드를 건들이지 않고 확장이 가능
→ Creator와 product의 관계를 느슨하게 가져간 것이다.

확장에 열려있고 변경에 닫혀있기 때문에 인스턴스를 생성하는 과정에서 기존의 코드를 건들이지 않고 확장이 가능하다.
→ creator와 product의 관계를 느슨하게 가져간 것이다.

단점

class가 많아진다 → 처음 보기에 구조가 복잡해 질 수 있다.

spring에서 어디에 적용이 되었을까?

GoF의 디자인 패턴에서 언급되는 패턴 중 하나로,
객체 생성과 관련된 디자인 패턴이다.

spring의 BeanFactory

BeanFactory는 인터페이스이고, 빈을 가져오기 위한 ApplicationContext이다.

이 때 xml 기반으로 작성된 정보를 가져와 Bean을 생성할 것인가,
java annotation기반으로 작성된 정보를 가져와 Bean을 생성할 것인가에 따라 달라진다.
결국 ‘어떤 기반으로 가져와 어떻게 생성할 것인가’가 달라져도 기존 코드의 수정 없이 Factory만 추가하면 된다는 것이다.

public static void main(String[] args) {
	BeanFactory xmlFactory = new ClassPathXmlApplicationContext("config.xml");
	String hello = xmlFactory.getBean("hello",String.class);

	BeanFactory annotationFactory= new AnnotationConfigApplicationContext("config.xml");
	String hello = annotationFactory.getBean("hello",String.class);
}

0개의 댓글