개발 상식/디자인 패턴

[디자인 패턴] 팩토리(Factory) 패턴

kku_lurgi 2023. 11. 8. 09:27

❓팩토리 패턴

팩토리 패턴은 생성 패턴중에서도 가장 기본이 되는 패턴이라고 합니다. 객체 생성 처리를 위임하여 객체 지향의 문제점을 해결할 수 있다고 하네요. 객체 생성을 담당하는 동작을 별도의 클래스 혹은 별도의 메서드로 분리하여 객체의 생성 동작을 위임하는 것을 말합니다.

즉 객체의 생성을 캡슐화 한다는 것!

❓팩토리 패턴의 장점

팩토피 패턴은 객체 지향의 문제점을 해결해 준다고 할 수 있습니다. new 연산자를 사용해 직접 객체를 생성하는 것은 ‘강력한 결합’을 만들어 낼 수 있습니다. 팩토리 패턴을 통해 ‘느슨한 결합’으로 만들어 의존성을 떨어뜨릴 수 있다는 것입니다.

❗팩토리 패턴의 예시 (JS)

class Korean {
	greeting () {
		return "안녕하세요"
	}
}

class App {
	static getInstance(){
		const KR = new Koran();
		return KR.greeting();
	}
}

위 코드를 팩토리 패턴을 통해서 다음과 같이 만들 수 있습니다.

class Korean {
	greeting () {
		return "안녕하세요"
	}
}

class Factory {
	static getInstance(){
		return new Korean();
	}
}

class App {
	static getInstance(){
		const KR = Factory.getInstance();
		return KR.greeting();
	}
}

이렇게 바뀐 코드만 놓고 보면 코드가 쓸데없이 길어진 것 같습니다. 왜 사용하는지 잘 모르겠네요. 그렇다면 생성할 객체가 많아진다면 어떨까요?

class Korean {
	greeting () {
		return "안녕하세요"
	}
}

class English {
	greeting () {
		return "Hello"
	}
}

class App {
	static getInstance(type){
		let instance
		if(type === "kr"){
			instance = new Korean();
		}
		if(type === "en"){
			instance = new English();
		}
		return instance.greeting();
	}
}

이 코드에 팩토리 패턴을 적용 해 보겠습니다.

class Korean {
	greeting () {
		return "안녕하세요"
	}
}

class English {
	greeting () {
		return "Hello"
	}
}

class Factory{
	static getInstance(type){
		if(type === "kr"){
			return new Korean();
		}
		if(type === "en"){
			return new English();
		}
	}
}

class App {
	static getInstance(type){
		const INSTANCE = Factory.getInstance(type)
		return INSTANCE.greeting();
	}
}

개인적으로 이렇게 객체의 개수가 늘어남에 따라 팩토리 패턴이 효과를 느낄 수 있었다고 생각합니다. 객체가 극단적으로 늘어났을 때의 경우라면 팩토리 패턴을 통해 안정적인 코드를 만들 수 있겠네요!