CS/λ””μžμΈ νŒ¨ν„΄

[λ””μžμΈ νŒ¨ν„΄] νŒ©ν† λ¦¬ νŒ¨ν„΄(Factory Pattern)

1eehyunji 2023. 8. 1. 20:05

객체λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œ 객체 생성 뢀뢄을 λ–Όμ–΄λ‚΄ μΆ”μƒν™”ν•œ νŒ¨ν„΄μ΄μž, 상속 관계에 μžˆλŠ” 두 ν΄λž˜μŠ€μ—μ„œ μƒμœ„ ν΄λž˜μŠ€κ°€ μ€‘μš”ν•œ λΌˆλŒ€λ₯Ό κ²°μ •ν•˜κ³ , ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ 객체 생성에 κ΄€ν•œ ꡬ체적인 λ‚΄μš©μ„ κ²°μ •ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€. 

 

μƒμœ„ ν΄λž˜μŠ€μ™€ ν•˜μœ„ ν΄λž˜μŠ€κ°€ λΆ„λ¦¬λ˜κΈ° λ•Œλ¬Έμ— λŠμŠ¨ν•œ 결합을 κ°€μ§€κ³ , μƒμœ„ ν΄λž˜μŠ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 생성 방식에 λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— 더 λ§Žμ€ μœ μ—°μ„±μ„ κ°€μ§€κ²Œ λœλ‹€. 

그리고 객체 생성 둜직이 λ”°λ‘œ λ–Όμ–΄μ Έ 있기 λ•Œλ¬Έμ— μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•˜λ”λΌλ„ ν•œ 곳만 κ³ μΉ  수 있게 λ˜μ–΄ μœ μ§€ λ³΄μˆ˜μ„±μ΄ μ¦κ°€ν•œλ‹€.

 

예λ₯Ό λ“€μ–΄, 라떼 λ ˆμ‹œν”Όμ™€ 아메리카노 λ ˆμ‹œν”Ό, 우유 λ ˆμ‹œν”ΌλΌλŠ” ꡬ체적인 λ‚΄μš©μ΄ λ“€μ–΄μžˆλŠ” ν•˜μœ„ ν΄λž˜μŠ€κ°€ 있고, μƒμœ„ 클래슀인 λ°”λ¦¬μŠ€νƒ€ 곡μž₯μ—μ„œ 이 λ ˆμ‹œν”Ό(ν•˜μœ„ν΄λž˜μŠ€)듀을 ν† λŒ€λ‘œ μƒν’ˆμ„ μƒμ‚°ν•˜λŠ” 생산 곡정을 생각할 수 μžˆλ‹€. 

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” κ°„λ‹¨ν•˜κ²Œ new Object()λ₯Ό μ΄μš©ν•΄μ„œ νŒ©ν† λ¦¬ νŒ¨ν„΄μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€. 

const num = new Object(42);
const str = new Object('abc');
num.constructor.name; // Number
str.constructor.name; // String

new Object()λŠ” λ‚΄μž₯ μƒμ„±μž ν•¨μˆ˜ 쀑 ν•˜λ‚˜λ‘œ, Object μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•œλ‹€. μƒμ„±λœ κ°μ²΄λŠ” Object.prototype을 μƒμ†λ°›λŠ”λ‹€. 

객체 생성과 κ΄€λ ¨λœ μ„ΈλΆ€ 사항을 ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ‘œλΆ€ν„° μΆ”μƒν™”ν•˜μ—¬ μ½”λ“œμ˜ 가독성을 높이고, μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.

λ˜ν•œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 동적 νƒ€μž… νŠΉμ„± λ•Œλ¬Έμ— λ‹€μ–‘ν•œ νƒ€μž…μ˜ 객체λ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•˜λŠ” 데 μ ν•©ν•˜λ‹€.

 

μœ„μ—μ„œ μ˜ˆμ‹œλ‘œ λ“  컀피 곡μž₯의 μ˜ˆμ‹œλ₯Ό μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ κ΅¬ν˜„ν•΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

Class Latte {
	constructor() {
    	this.name='latte';
    }
}

Class Espresso {
	constructor() {
    	this.name='espresso';
    }
}

Class LatteFactory {
	static createCoffee() {
    	return new Latte()
    }
}

Class EspressoFactory {
	static createCoffee() {
    	return new Espresso()
    }
}

const factoryList = { LatteFactory, EspressoFactory }

class CoffeeFactory {
	static createCoffee(type) {
    	const factory = factoryList[type]
        return factory.createCoffee()
    }
}

const main=()=>{
	// 라떼 컀피λ₯Ό μ£Όλ¬Έν•œλ‹€.
    const coffee = CoffeeFactory.createCoffee("LatteFactory")
	// 컀피 이름을 λΆ€λ₯Έλ‹€.
    console.log(coffee.name) //latte
}

main()

CoffeeFactoryλΌλŠ” μƒμœ„ν΄λž˜μŠ€κ°€ μ€‘μš”ν•œ λΌˆλŒ€λ₯Ό κ²°μ •ν•˜κ³ , ν•˜μœ„ 클래슀인 LatteFactoryκ°€ ꡬ체적인 λ‚΄μš©μ„ κ²°μ •ν•˜κ³  μžˆλ‹€.

μ΄λŠ” μ˜μ‘΄μ„± μ£Όμž…μ΄λΌκ³ λ„ ν•  수 μžˆλ‹€. CoffeeFactoryμ—μ„œ LatteFactory의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, LatteFactoryμ—μ„œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό CoffeeFactory에 μ£Όμž…ν•˜κ³  있기 λ•Œλ¬Έμ΄λ‹€. 

 

또, CoffeeFactory 클래슀λ₯Ό 보면 static ν‚€μ›Œλ“œλ₯Ό 톡해 createCoffee() λ©”μ„œλ“œλ₯Ό 정적 λ©”μ„œλ“œλ‘œ μ„ μ–Έν–ˆλŠ”λ°, μ΄λ ‡κ²Œ 정적 λ©”μ„œλ“œλ‘œ μ •μ˜ν•˜λ©΄ 클래슀λ₯Ό 기반으둜 객체λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  호좜이 κ°€λŠ₯ν•˜λ©°, ν•„μš”ν•  λ•Œλ§ˆλ‹€ 객체λ₯Ό μƒμ„±ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή λ©”μ„œλ“œμ— λŒ€ν•œ λ©”λͺ¨λ¦¬ 할당을 ν•œ 번만 ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.