팩토리 패턴(Factory Pattern)

김종헌·2021년 8월 4일
0

디자인패턴

목록 보기
1/1

팩토리 패턴

객체지향 언어에서 한 클래스가 다른 클래스를 참조하는 경우가 존재한다. 이때 두 클래스 간 결합 관계가 발생하는데 참조 방식에 따라 결합의 정도가 달라지며 만약 강한 결합 관계가 형성된다면 유지보수 및 업데이트가 힘들어진다.

public interface Dictionary{...}
public class Korean implements Dictionary{...}

public class A{
	private static final Dictionary dict = new Korean();
	...
}

위와 같이 다른 클래스를 참조하고, new 키워드를 통해 인스턴스를 생성하게 되는 경우 강한 결합 관계가 형성된다. 만약 여기서 영어 사전을 추가하고 상황에 따라 필요한 사전을 사용해야 한다면 어떻게 해야할까? 아마 다음과 같이 코드를 변경해야 할 것이다.

public class English implements Dictionary{...}

public class B{
	private Dictionary dict;
	private static final String KOREA = "kr";
	private static final String ENGLISH = "en";

	B(String val){
		if(KOREA.equals(val)) dict = new Korean();
		else if(ENGLISH.equals(val)) dict = new English();
	}
}

물론 A 클래스만 Dictionary를 사용하는 경우는 조금의 불편함이 있겠지만 복잡하지는 않을 것이다. 하지만 많은 클래스가 Dictionary를 사용하게 되는 경우는 어떻게 될까? 하나의 새로운 사전이 추가될 때마다 해당하는 모든 클래스를 수정해야 하는 어려움이 발생할 것이다.
이러한 어려움을 해소하기 위한 방법으로는 의존성 주입(Dependency Injection)이 존재한다. 의존성 주입은 쉽게 말해 클래스가 직접 new 키워드를 통해 참조 클래스의 인스턴스를 생성하는 대신 외부에서 전달받는 방법이다.

public class C{
	private final Dictionary dict;

	C(Dictionary dict){this.dict = dict;}
}

자 이제 사전이 추가되더라도 Dictionary를 참조하는 클래스의 코드가 변경될 일이 없어졌다. 하지만 C 클래스를 사용하는 곳에서 Dictionary 객체를 생성 후 넘겨줘야 하며 문제점이 발생하게 되었고 이를 해결하기 위해서 팩토리 패턴이 나오게 되었다.

class DictionaryFactory{
	private static final String KOREA = "kr";
	private static final String ENGLISH = "en";
	
	public DictionaryFactory(String type){
		if(type == null || type.trim().equals("")) throw new IllegalArgumentException();
		if(KOREA.equals(type)) return new Korean();
		else if(ENGLISH.equals(type)) return new English();
		throw new IllegalArgumentException();
	}
}

팩토리 패턴을 통해 강력한 의존 관계를 분리하고 느슨한 의존 관계로 변경했다. 하지만 팩토리 패턴을 사용하면 Factory 객체를 통해 호출하는 과정이 필요하기 때문에 프로그램 성능 저하가 발생할 수 있지만 객체 생성을 다른 객체에 위임함으로써 내부적인 결합을 제거하고, 동적으로 객체를 관리할 수 있다는 장점이 있다.

profile
junior development

0개의 댓글