JavaRush /Java Blog /Random-KO /๋””์ž์ธ ํŒจํ„ด: AbstractFactory

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

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ๋””์ž์ธ ํŒจํ„ด์„ ์—ฐ๊ตฌํ•˜๊ณ  ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค . ๋””์ž์ธ ํŒจํ„ด: AbstractFactory - 1๊ฐ•์˜ ์ค‘์— ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ:
  • ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์ด ํŒจํ„ด์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ธ์ง€ ๋…ผ์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธํ•˜๊ธฐ ์œ„ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋ณด๋„ˆ์Šค๋กœ ๊ฐ•์˜์—๋Š” ์ด์Šคํ„ฐ ์—๊ทธ๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— Java๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šด์˜ ์ฒด์ œ์˜ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•˜๊ณ  ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ํŒจํ„ด์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฃผ์ œ๋ฅผ ์ž˜ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Java์˜ ์ƒ์†;
  • Java์˜ ์ถ”์ƒ ํด๋ž˜์Šค ๋ฐ ๋ฉ”์†Œ๋“œ.

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

๋ชจ๋“  ํŒฉํ† ๋ฆฌ ํŒจํ„ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ ๋„์›€์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ƒํ˜ธ ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด์˜ ๋‹ค์–‘ํ•œ ๊ณ„์—ด์˜ "๋ฆด๋ฆฌ์Šค"๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ƒํ˜ธ ์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ ๋‹ค์–‘ํ•œ ๊ณ„์—ด...์ด๊ฒŒ ๋ฌด์—‡์ธ๊ฐ€์š”? ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์‹ค์ œ๋กœ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ๊ฐœ์ฒด์˜ ๊ณ„์—ด์ด ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ๊ณผ ๋‚ด๊ฐ€ ์ „๋žต์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๊ณ  ๊ทธ ์•ˆ์— ์—ฌ๋Ÿฌ ์ „ํˆฌ ์œ ๋‹›์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋ณด๋ณ‘;
  • ๊ธฐ๋ณ‘๋Œ€;
  • ๊ถ์ˆ˜.
์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ „ํˆฌ ์œ ๋‹›์€ ๋™์ผํ•œ ๊ตฐ๋Œ€์—์„œ ๋ณต๋ฌดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์— ๋‚˜์—ด๋œ ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ์ƒํ˜ธ ๊ด€๋ จ๋œ ๊ฐœ์ฒด์˜ ๊ณ„์—ด์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์ƒํ˜ธ ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด์˜ ๋‹ค์–‘ํ•œ ๊ณ„์—ด ์ƒ์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ „๋žต์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ๊ณ„์†ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐ˜๋Œ€ ์ธก๋ฉด์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ง„์˜์˜ ์ „ํˆฌ ์œ ๋‹›์€ ์™ธ๊ด€์ด ํฌ๊ฒŒ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋งˆ ๊ตฐ๋Œ€์˜ ๋ณด๋ณ‘, ๊ธฐ๋ณ‘, ๊ถ์ˆ˜๋Š” ๋ฐ”์ดํ‚น์˜ ๋ณด๋ณ‘, ๊ธฐ๋ณ‘, ๊ถ์ˆ˜์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „๋žต์˜ ํ‹€ ๋‚ด์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฐ๋Œ€์˜ ๊ตฐ์ธ์€ ์„œ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฐœ์ฒด์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ„์—ด์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜๋กœ ๋‚˜ํด๋ ˆ์˜น ์‹œ๋Œ€์˜ ํ”„๋ž‘์Šค ์ œ๋ณต์„ ์ž…์€ ๊ตฐ์ธ์ด ๋จธ์Šคํ‚ท ์ด์„ ๋“ค๊ณ  ๋กœ๋งˆ ๋ณด๋ณ‘๋Œ€ ์‚ฌ์ด๋ฅผ ๋Œ์•„๋‹ค๋‹ˆ๊ณ  ์žˆ๋‹ค๋ฉด ์žฌ๋ฏธ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ถ”์ƒ์ ์ธ ํŒฉํ† ๋ฆฌ ๋””์ž์ธ ํŒจํ„ด์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค. ์•„๋‹ˆ์š”, ์‹œ๊ฐ„ ์—ฌํ–‰์œผ๋กœ ์ธํ•œ ๋‹นํ™ฉ์Šค๋Ÿฌ์šด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ƒํ˜ธ ์—ฐ๊ฒฐ๋œ ๋‹ค์–‘ํ•œ ๊ฐœ์ฒด ๊ทธ๋ฃน์ด ์ƒ์„ฑ๋˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ๊ธฐ์กด์˜ ๋ชจ๋“  ์ œํ’ˆ(ํŒจ๋ฐ€๋ฆฌ ๊ฐ์ฒด)์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ๊ฐ๊ฐ์€ ๋ณ€ํ˜• ์ค‘ ํ•˜๋‚˜์˜ ์ œํ’ˆ์„ ๋งŒ๋“œ๋Š” ์ผ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ „๋žต์˜ ์ผํ™˜์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ถ”์ƒ์ ์ธ ๋ณด๋ณ‘, ๊ถ์ˆ˜, ๊ธฐ๋ณ‘์„ ์ƒ์„ฑํ•˜๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์™€ ์ด ํŒฉํ† ๋ฆฌ์˜ ๊ตฌํ˜„์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋กœ๋งˆ ๊ตฐ๋‹จ๋ณ‘์„ ๋งŒ๋“œ๋Š” ๊ณต์žฅ, ์˜ˆ๋ฅผ ๋“ค์–ด ์นด๋ฅดํƒ€๊ณ  ์ „์‚ฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณต์žฅ. ์ถ”์ƒํ™”๋Š” ์ด ํŒจํ„ด์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์›์น™์ž…๋‹ˆ๋‹ค. ํŒฉํ† ๋ฆฌ ํด๋ผ์ด์–ธํŠธ๋Š” ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ œํ’ˆ ๋ฐ ์ œํ’ˆ๊ณผ ํ•จ๊ป˜ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ „์‚ฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ์ด ์ฑ…์ž„์„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์˜ ํŠน์ • ๊ตฌํ˜„์œผ๋กœ ์ด์ „ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ์ปคํ”ผ์ˆ์„ ์ž๋™ํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

์ง€๋‚œ ๊ฐ•์˜ ์—์„œ ์šฐ๋ฆฌ๋Š” ํŒฉํ† ๋ฆฌ ๋ฐฉ์‹ ํŒจํ„ด์„ ์—ฐ๊ตฌํ–ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ปคํ”ผ ์‚ฌ์—…์„ ํ™•์žฅํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ์ปคํ”ผ ํŒ๋งค ์ง€์ ์„ ์—ด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋„ ์šฐ๋ฆฌ๋Š” ์‚ฌ์—…์„ ํ˜„๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ์„ ๊ณ„์†ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜จ๋ผ์ธ์œผ๋กœ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํƒ‘์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ๋•Œ ํ•ญ์ƒ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ macOS์™€ Windows ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์Šคํฌ์ผ๋Ÿฌ: Linux๋Š” ์ˆ™์ œ๋กœ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค). ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์–ด๋–ค ๋ชจ์Šต์ผ๊นŒ์š”? ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ…์ŠคํŠธ ํ•„๋“œ, ์„ ํƒ ํ•„๋“œ ๋ฐ ๋ฒ„ํŠผ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์–‘์‹์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์šด์˜ ์ฒด์ œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด Windows์˜ ๋ฒ„ํŠผ์ด Mac๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์ ์„ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ... ์ž, ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ดํ•ดํ•˜์…จ๊ฒ ์ง€๋งŒ ์ œํ’ˆ๊ตฐ์˜ ์—ญํ• ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ„ํŠผ;
  • ํ…์ŠคํŠธ ํ•„๋“œ;
  • ์„ ํƒ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
๋ถ€์ธ ์„ฑ๋ช…. ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์—์„œ onClick, onValueChanged๋˜๋Š” ์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค onInputChanged. ์ €๊ฒƒ๋“ค. ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ(๋ฒ„ํŠผ ํด๋ฆญ, ํ…์ŠคํŠธ ์ž…๋ ฅ, ์„ ํƒ ์ƒ์ž์—์„œ ๊ฐ’ ์„ ํƒ)๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ์˜ˆ์ œ์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์—ฐ๊ตฌํ•˜๋Š” ๋ฐ ๋” ์‹œ๊ฐ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œํ’ˆ์— ๋Œ€ํ•œ ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
public interface Button {}
public interface Select {}
public interface TextField {}
๊ฐ ์šด์˜ ์ฒด์ œ์— ๋Œ€ํ•ด ํ•ด๋‹น ์šด์˜ ์ฒด์ œ ์Šคํƒ€์ผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Windows์™€ MacOS์šฉ์œผ๋กœ ๊ธ€์„ ์”๋‹ˆ๋‹ค. Windows์šฉ ๊ตฌํ˜„์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
public class WindowsButton implements Button {
}

public class WindowsSelect implements Select {
}

public class WindowsTextField implements TextField {
}
์ด์ œ MacOS์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
public class MacButton implements Button {
}

public class MacSelect implements Select {
}

public class MacTextField implements TextField {
}
์—„์ฒญ๋‚œ. ์ด์ œ ๊ธฐ์กด์˜ ๋ชจ๋“  ์ถ”์ƒ ์ œํ’ˆ ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public interface GUIFactory {

    Button createButton();
    TextField createTextField();
    Select createSelect();

}
์™„๋ฒฝํ•œ. ๋ณด์‹œ๋‹ค์‹œํ”ผ ์ง€๊ธˆ๊นŒ์ง€ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ œํ’ˆ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์šฐ๋ฆฌ๋Š” ๊ฐ OS์— ๋Œ€ํ•ด ๊ณต์žฅ์„ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Windows๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
public class WindowsGUIFactory implements GUIFactory {
    public WindowsGUIFactory() {
        System.out.println("Creating gui factory for Windows OS");
    }

    public Button createButton() {
        System.out.println("Creating Button for Windows OS");
        return new WindowsButton();
    }

    public TextField createTextField() {
        System.out.println("Creating TextField for Windows OS");
        return new WindowsTextField();
    }

    public Select createSelect() {
        System.out.println("Creating Select for Windows OS");
        return new WindowsSelect();
    }
}
์ž‘๋™ ๋ฐฉ์‹์„ ์ž์„ธํžˆ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ๋ฐ ์ƒ์„ฑ์ž ๋‚ด๋ถ€์˜ ์ฝ˜์†” ์ถœ๋ ฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ macOS์˜ ๊ฒฝ์šฐ:
public class MacGUIFactory implements GUIFactory {
    public MacGUIFactory() {
        System.out.println("Creating gui factory for macOS");
    }

    @Override
    public Button createButton() {
        System.out.println("Creating Button for macOS");
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        System.out.println("Creating TextField for macOS");
        return new MacTextField();
    }

    @Override
    public Select createSelect() {
        System.out.println("Creating Select for macOS");
        return new MacSelect();
    }
}
์ฐธ๊ณ : ๊ฐ ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋ช…์— ๋”ฐ๋ผ ์ถ”์ƒ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ์šฐ๋ฆฌ๋Š” ์ œํ’ˆ์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์œ ์ผํ•œ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์–‘์‹ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ•„๋“œ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ์ธ Java ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
public class OrderCoffeeForm {
    private final TextField customerNameTextField;
    private final Select coffeTypeSelect;
    private final Button orderButton;

    public OrderCoffeeForm(GUIFactory factory) {
        System.out.println("Creating order coffee form");
        customerNameTextField = factory.createTextField();
        coffeTypeSelect = factory.createSelect();
        orderButton = factory.createButton();
    }
}
์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์–‘์‹ ์ƒ์„ฑ์ž์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • OS์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„์„ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
public class Application {
    private OrderCoffeeForm orderCoffeeForm;

    public void drawOrderCoffeeForm() {
        // ะžะฟั€ะตะดะตะปะธะผ Name ะพะฟะตั€ะฐั†ะธะพะฝะฝะพะน ัะธัั‚ะตะผั‹, ะฟะพะปัƒั‡ะธะฒ meaning ัะธัั‚ะตะผะฝะพะน ะฟั€ะพะฟะตั€ั‚ะธ ั‡ะตั€ะตะท System.getProperty
        String osName = System.getProperty("os.name").toLowerCase();
        GUIFactory guiFactory;

        if (osName.startsWith("win")) { // ะ”ะปั windows
            guiFactory = new WindowsGUIFactory();
        } else if (osName.startsWith("mac")) { // ะ”ะปั mac
            guiFactory = new MacGUIFactory();
        } else {
            System.out.println("Unknown OS, can't draw form :( ");
            return;
        }
        orderCoffeeForm = new OrderCoffeeForm(guiFactory);
    }

    public static void main(String[] args) {
        Application application = new Application();
        application.drawOrderCoffeeForm();
    }
}
Windows์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Creating gui factory for Windows OS
Creating order coffee form
Creating TextField for Windows OS
Creating Select for Windows OS
Creating Button for Windows OS
Mac์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

Creating gui factory for macOS
Creating order coffee form
Creating TextField for macOS
Creating Select for macOS
Creating Button for macOS
๋ฆฌ๋ˆ…์Šค์˜ ๊ฒฝ์šฐ:

Unknown OS, can't draw form :( 
๊ธ€์Ž„, ๋‹น์‹ ๊ณผ ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํŠน์ • OS์— ์ ํ•ฉํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๋Š” GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ฒƒ์„ ๊ฐ„๋‹จํžˆ ๋ฐ˜๋ณตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์ œํ’ˆ๊ตฐ: ์ž…๋ ฅ ํ•„๋“œ, ์„ ํƒ ํ•„๋“œ ๋ฐ ๋ฒ„ํŠผ.
  • Windows ๋ฐ macOS์šฉ์œผ๋กœ ์ด ์ œํ’ˆ๊ตฐ์„ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œํ’ˆ ์ƒ์„ฑ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ ๊ณต์žฅ์˜ ๋‘ ๊ฐ€์ง€ ๊ตฌํ˜„์€ ๊ฐ๊ฐ ํŠน์ • ์ œํ’ˆ๊ตฐ์„ ๋งŒ๋“œ๋Š” ์ผ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์ˆ˜ ๊ฐ’์œผ๋กœ ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”๋˜๋Š” ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋ฅผ ํ•„๋“œ๋กœ ํฌํ•จํ•˜๋Š” Java ํด๋ž˜์Šค์ธ ์–‘์‹์ž…๋‹ˆ๋‹ค.
  • ์‘์šฉ ์ˆ˜์—…. ๊ทธ ์•ˆ์—๋Š” ๊ณต์žฅ์˜ ํ•„์ˆ˜ ๊ตฌํ˜„์„ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•˜๋Š” ์–‘์‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์ „์ฒด: ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ƒ ํŒฉํ† ๋ฆฌ: ์‚ฌ์šฉ ์ง€์นจ

Abstract Factory๋Š” ํŠน์ • ์ œํ’ˆ ํด๋ž˜์Šค์— ์–ฝ๋งค์ด์ง€ ์•Š๊ณ  ๋‹ค์–‘ํ•œ ์ œํ’ˆ๊ตฐ ์ƒ์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1. ์ œํ’ˆ๊ตฐ ์ž์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. ์ œํ’ˆ๊ตฐ ๋‚ด์˜ ๊ฐ ์ œํ’ˆ์— ๋Œ€ํ•ด ์ถ”์ƒ ํด๋ž˜์Šค(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ProductA
    • ProductB
  3. ๊ฐ ์ œํ’ˆ๊ตฐ ๋‚ด์—์„œ ๊ฐ ์ œํ’ˆ์€ 2๋‹จ๊ณ„์—์„œ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. 2๋‹จ๊ณ„์—์„œ ์ •์˜ํ•œ ๊ฐ ์ œํ’ˆ์— ๋Œ€ํ•œ ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ProductA createProductA();
    • ProductB createProductB();
  5. ๊ฐ ๊ตฌํ˜„์ด ๋™์ผํ•œ ์ œํ’ˆ๊ตฐ์˜ ์ œํ’ˆ ์ƒ์„ฑ์„ ์ œ์–ดํ•˜๋„๋ก ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์˜ ๊ฐ ๊ตฌํ˜„ ๋‚ด์—์„œ ๋ชจ๋“  ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ œํ’ˆ์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ด ์ƒ์„ฑ๋˜๊ณ  ๋ฐ˜ํ™˜๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ์œ„์— ์„ค๋ช…๋œ ์ง€์นจ์„ ์„ค๋ช…ํ•˜๋Š” UML ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๋””์ž์ธ ํŒจํ„ด: AbstractFactory - 3์ด์ œ ์ด ์ง€์นจ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
// ะžะฟั€ะตะดะตะปะธะผ ะพะฑั‰ะธะต ะธะฝั‚ะตั€ั„ะตะนัั‹ ะฟั€ะพะดัƒะบั‚ะพะฒ
public interface ProductA {}
public interface ProductB {}

// ะกะพะทะดะฐะดะธะผ ั€ะฐะทะปะธั‡ะฝั‹ะต ั€ะตะฐะปะธะทะฐั†ะธะธ (ัะตะผะตะนัั‚ะฒะฐ) ะฝะฐัˆะธั… ะฟั€ะพะดัƒะบั‚ะพะฒ
public class SpecificProductA1 implements ProductA {}
public class SpecificProductB1 implements ProductB {}

public class SpecificProductA2 implements ProductA {}
public class SpecificProductB2 implements ProductB {}

// ะกะพะทะดะฐะดะธะผ ะฐะฑัั‚ั€ะฐะบั‚ะฝัƒัŽ ั„ะฐะฑั€ะธะบัƒ
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// ะกะพะทะดะฐะดะธะผ ั€ะตะฐะปะธะทะฐั†ะธัŽ ะฐะฑัั‚ั€ะฐะบั‚ะฝะพะน ั„ะฐะฑั€ะธะบะธ ะดะปั ัะพะทะดะฐะฝะธั ะฟั€ะพะดัƒะบั‚ะพะฒ ัะตะผะตะนัั‚ะฒะฐ 1
public class SpecificFactory1 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB1();
    }
}

// ะกะพะทะดะฐะดะธะผ ั€ะตะฐะปะธะทะฐั†ะธัŽ ะฐะฑัั‚ั€ะฐะบั‚ะฝะพะน ั„ะฐะฑั€ะธะบะธ ะดะปั ัะพะทะดะฐะฝะธั ะฟั€ะพะดัƒะบั‚ะพะฒ ัะตะผะตะนัั‚ะฒะฐ 1
public class SpecificFactory2 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB2();
    }
}

์ˆ™์ œ

์ž๋ฃŒ๋ฅผ ํ†ตํ•ฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. Linux์—์„œ ์ž‘๋™ํ•˜๋„๋ก ์ปคํ”ผ ์ฃผ๋ฌธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž์‹ ๋งŒ์˜ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ชจ๋“  ์ „๋žต์˜ ๋‹จ์œ„๋ฅผ ์ƒ์‚ฐํ•˜์„ธ์š”. ์ด๋Š” ์‹ค์ œ ๊ตฐ๋Œ€๋ฅผ ์ด์šฉํ•œ ์—ญ์‚ฌ์  ์ „๋žต์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์˜คํฌ, ๋“œ์›Œํ”„, ์—˜ํ”„๋ฅผ ์ด์šฉํ•œ ํŒํƒ€์ง€์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์› ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐฝ์˜๋ ฅ์„ ๋ฐœํœ˜ํ•˜๊ณ , ์ฝ˜์†”์— ํ•€์„ ๊ฒŒ์‹œํ•˜๊ณ , ํŒจํ„ด์„ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋ฐฐ์›Œ๋ณด์„ธ์š”!
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION