๐Ÿ“Œ[๋””์ž์ธ ํŒจํ„ด] ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ (Factory Method)

๋ชจ๊น…ยท2023๋…„ 10์›” 21์ผ
0

๋””์ž์ธ ํŒจํ„ด

๋ชฉ๋ก ๋ณด๊ธฐ
3/6
post-custom-banner

๐Ÿ“– 01. Factory Method๋ž€?

๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€๋ฅผ ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ์ •ํ•˜๋Š” ํŒจํ„ด์„ ๋งํ•œ๋‹ค.

  • ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์€, ๊ธฐ๋Šฅํ˜น์€ ์—ญํ• ์— ๋”ฐ๋ฅธ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€(Product) ๊ฐ€ ์กด์žฌํ•˜๊ณ , ๊ทธ ์ค‘์—์„œ ํŠน์ •ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํŒฉํ† ๋ฆฌ(Creator)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

<ํด๋ž˜์Šค ๊ตฌ์กฐ๋„>

๐Ÿ“– 02. Factory Method ํŒจํ„ด ์˜ˆ์‹œ

  • ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์˜ ๋ชฉ์ ์€ "๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ๊ณ , ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๋Š” ๊ตฌ์กฐ" ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, OCP ์›์น™์„ ์ง€ํ‚ค๊ธฐ์œ„ํ•œ ํŒจํ„ด์— ๊ฐ€๊น๋‹ค.

01. Factory Method ์‚ฌ์šฉ ์ „

ship.class

Factory.class

-> ํด๋ผ์ด์–ธํŠธ์—์„œ white ship์„ ๋งŒ๋“ค๊ฒƒ์ธ๊ฐ€, black ship์„ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜๋˜๋Š” ship ์ด ๋‹ฌ๋ผ์ง€๋Š” ์ฝ”๋“œ์ด๋‹ค.

-> Factory ๋ฅผ ํ†ตํ•ด ์š”๊ตฌ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ Ship ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€๋งŒ, ๋งŒ์•ฝ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด Factory ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค.

๐Ÿ’ก ์ฆ‰ ์ด ์ฝ”๋“œ๋Š”, ๋ณ€๊ฒฝ์— ๋‹ซํ˜€์žˆ์ง€ ์•Š์€ ์ฝ”๋“œ์ธ ๊ฒƒ์ด๋‹ค!

02. Factory Method ์‚ฌ์šฉ ํ›„

  1. ๋จผ์ € ๋ฐฐ๋ฅผ๋งŒ๋“œ๋Š”, Factory ๋ฅผ Interface ๋กœ ๊ตฌํ˜„ํ•˜์ž.
  • ๊ธฐ์กด์— ShipFactory์—์„œ ์ง„ํ–‰ํ•˜๋˜ validate๋„ ShipFactory๋กœ ํ•˜๋ฉฐ, ๋ฐฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ƒ์„ฑ์‹œํ‚ค๋Š” createShip( ) ๋ฉ”์†Œ๋“œ๋งŒ ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋กœ ์ •์˜ํ•˜์ž.
    -> createShip( )์ด Factory Method( )๊ฐ€ ๋œ๋‹ค!
  1. ๊ทธ ๋‹ค์Œ, ์ง์ ‘์ ์œผ๋กœ ๋ฐฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” createShip() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ๊ฐ ์ฑ…์ž„์— ๋งž๊ฒŒ ์ •์˜ํ•˜์ž.

-> ship๊ณผ ๊ทธ ๊ตฌํ˜„์ฒด๋“ค(whiteship, blackship)์ด Factory๊ฐ€ ์ƒ์‚ฐํ•ด ๋‚ผ Product๊ฐ€ ๋œ๋‹ค!
-> Product๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—ฌ๋„ ์ƒ๊ด€์—†๊ณ  ship๊ณผ ๊ฐ™์ด ํด๋ž˜์Šค์—ฌ๋„ ์ƒ๊ด€์—†๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ ๋งŒ๋“ค ๋ฐฐ์— ๋”ฐ๋ผ์„œ, ํ•ด๋‹นํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒํ•˜์ž.

๐Ÿ‘๐Ÿป ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€, ๋‹ค์Œ RedShip, BludShip ๋“ฑ,, ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์—์˜ํ•ด ์ถ”๊ฐ€์ ์ธ ๋ฐฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ด๋„, ๊ธฐ์กด์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, createShip()๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„์ฒด๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ฆ‰ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ๊ณ , ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๋Š” OCP ๋ฅผ ์ง€ํ‚ค๋Š” ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

โ†’ ํด๋ผ์ด์–ธํŠธ์˜ ๋ณ€๊ฒฝ๋„ ์ตœ์†Œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณ„์ธต์„ ํ•˜๋‚˜ ๋” ๋‘๊ฑฐ๋‚˜, ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›๊ฑฐ๋‚˜ ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

cf) interface์˜ private method๋Š” ์ž๋ฐ” 9์ดํ›„๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์กŒ๋‹ค.
์ž๋ฐ” 9์ด์ „์˜ ๋ฒ„์ „์ด๋ผ๋ฉด private๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ?
-> ShipFactory interface๋ฅผ ์ƒ์†๋ฐ›๋Š” abstract class๋ฅผ ์ค‘๊ฐ„๊ณ„์ธต์— ๋งŒ๋“ค์–ด์„œ private์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜๊ณ  WhiteShipFactory๋Š” ShipFactory๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ abstract class๋ฅผ ์ƒ์†๋ฐ›์€ ํ›„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค!

๐Ÿ“– 03. Factory Method ์žฅ๋‹จ์ 

  • ์žฅ์ 
  1. ์š”๊ตฌ์‚ฌํ•ญ์˜ ๋ณ€๊ฒฝ์—๋„ ๊ธฐ์กด์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด๊ธฐ์ข‹์€ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.
    ์ด๋Š”, product์™€ creater๊ฐ„์— ๊ด€๊ณ„๋ฅผ ๋Š์Šคํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ๋ฌถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.
  • ๋‹จ์ 
  1. ๊ฐ์ž์˜ ์—ญํ• ์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ํด๋ž˜์Šค๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. (๊ด€๋ฆฌ ํฌ์ธํŠธ์˜ ์ฆ๊ฐ€)

๐Ÿ“– ์งˆ๋ฌธ!!

  1. ํ™•์žฅ์— ์—ด๋ ค์žˆ๊ณ  ๋ณ€๊ฒฝ์— ๋‹ซํ˜€์žˆ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์›์น™์„ ์„ค๋ช…ํ•˜์„ธ์š”.
  • ๋ณ€๊ฒฝ์— ๋‹ซํ˜€์žˆ๋‹ค : ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ™•์žฅ์— ์—ด๋ ค์žˆ๋‹ค : ์ƒˆ๋กœ์šด ์ฝ”๋“œ(๊ธฐ๋Šฅ)๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ํ™•์žฅํ•œ๋‹ค.
  1. ์ž๋ฐ” 8์— ์ถ”๊ฐ€๋œ default ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์„ธ์š”.
  • ๊ธฐ์กด ์ž๋ฐ” ๋ฒ„์ „์—์„œ๋Š” interface ์—๋Š” ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋งŒ์ด ์„ ์–ธ ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ฒด์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.
  • ์ž๋ฐ” 8 ์ดํ›„์— ์ถ”๊ฐ€๋œ default ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์„œ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๋งŒ๋“ค์—ˆ๋‹ค.
  • ์ดํ›„ ์ž๋ฐ” 9 ์ดํ›„์— ๋งŒ๋“ค์–ด์ง„ private๋Š” ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ๊ตฌํ˜„๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.





์ฐธ๊ณ  ์ž๋ฃŒ)
https://thalals.tistory.com/402 - ํž˜์ฐจ๊ฒŒ, ์—ด์‹ฌํžˆ ๊ณต๋Œ€์ƒ

profile
๋ฉˆ์ถ”์ง€ ์•Š๊ธฐ
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€