헬린코린이

[Spring Framework] 팩토리 패턴 본문

Programming/Spring Framework

[Spring Framework] 팩토리 패턴

HCD 2023. 2. 7. 18:31

팩토리 패턴(factory pattern)

- 객체를 생성하는 인터페이스는 미리 정의하되, 인스턴스를 만들 클래스의 결정은 서브 클래스 쪽에서 내리는

패턴입니다. 다시 말해 여러 개의 서브 클래스를 가진 슈퍼 클래스가 있을 때 인풋에 따라 하나의 자식 클래스의

인스턴스를 리턴해주는 방식입니다.

팩토리 패턴에서는 클래스의 인스턴스를 만드는 시점을 서브 클래스로 미룹니다.

이 패턴은 인스턴스화에 대한 책임을 객체를 사용하는 클라이언트에서 팩토리 클래스로 가져옵니다.

 

인터페이스를 하나 정의합니다.

package test;

public interface Phone {
	void powerOn();
	void powerOff();
	void volumeUp();
	void volumeDown();
}

이 인터페이스를 구현하는 자식클래스를 만듭니다.

package test;

public class ApplePhone implements Phone {
	@Override
	public void powerOn() {
		System.out.println("애플폰 ON");
	}
	@Override
	public void powerOff() {
		System.out.println("애플폰 OFF");
	}
	@Override
	public void volumeUp() {
		System.out.println("애플폰 사운드 ++");
	}
	@Override
	public void volumeDown() {
		System.out.println("애플폰 사운드 --");
	}

}

자식클래스 - 2

package test;

public class KiwiPhone implements Phone {
	@Override
	public void powerOn() {
		System.out.println("키위폰 ON");
	}
	@Override
	public void powerOff() {
		System.out.println("키위폰 OFF");
	}
	@Override
	public void volumeUp() {
		System.out.println("키위폰 사운드 ++");
	}
	@Override
	public void volumeDown() {
		System.out.println("키위폰 사운드 --");
	}

}

Factory  class입니다.

package test;

public class BeanFactory {
	public Object getBean(String  beanName) {
		if(beanName.equals("applePhone")) {
			return new ApplePhone();
		}else if(beanName.equals("KiwiPhone")) {
			return new KiwiPhone();
		}
		return null;
	}
}

 

팩트로 패턴의 장점으로는

-  팩토리 패턴은 클라이언트 코드로부터 서브 클래스의 인스턴스화를 제거하여 서로 간의 종속성을 낮추고, 결합도를 느슨하게 하며, 확장을 쉽게 합니다.

예를 들어, 위 예제에서 작성한 클래스 중 PC class에 대해 수정 혹은 삭제가 일어나더라고 클라이언트는 알 수 없기 때문에 코드를 변경할 필요도 없습니다.

 

Comments