GoF์˜ ๋””์ž์ธ ํŒจํ„ด, ์ฒซ๋ฒˆ์งธ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

ํ•ด๋‹น ๊ธ€์€, ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ

Factory์˜ ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ œํ’ˆ๊ตฐ์— ๋งž๋Š” ํ•˜์œ„ Component๋ฅผ ๋งŒ๋“œ๋Š” Factory๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด ๋ณ€ํ™”์— ์‰ฝ๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ํŒจํ„ด

  • ์„œ๋กœ ๋‹ค๋ฅธ ์ œํ’ˆ๊ตฐ (OS์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ)์„ ๋งŒ๋“ค ๋•Œ ์šฉ์ดํ•˜๋‹ค.
  • ๊ณตํ†ต Component๋ฅผ ์ƒ์„ฑํ•˜๋Š” Factory๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋‘”๋‹ค.
  • ์‹ค์ œ Factory์—์„œ๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ž์‹ ์˜ ์ œํ’ˆ๊ตฐ์— ๋งž๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ƒˆ๋กœ์šด ์ œํ’ˆ๊ตฐ์— ๋Œ€ํ•ด ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๋‹น API๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์—ญ์‹œ, ์ถ”์ƒํ™”๋œ Component๋งŒ์„ ๋ณด๊ณ  ์ž‘์—…์„ ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•˜๋‹ค.
  • ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ โ€œKitโ€๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

๋™๊ธฐ

  • ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ์ œํ’ˆ๊ตฐ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์›น, ์œˆ๋„์šฐ, ๋งฅ, ๋ฆฌ๋ˆ…์Šค์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด?

ํ™œ์šฉ์„ฑ

  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ๊ตฌ์„ฑ, ํ‘œํ˜„ ๋ฐฉ์‹๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‹œ์Šคํ…œ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ
  • ์—ฌ๋Ÿฌ ์ œํ’ˆ๊ตฐ ์ค‘ ํ•˜๋‚˜๋กœ ์‹œ์Šคํ…œ์„ ์„ค์ •ํ•ด์•ผ ํ•˜๊ณ , ํ•œ๋ฒˆ ๊ตฌ์„ฑํ•œ ์ œํ’ˆ์„ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๋•Œ
  • ๊ด€๋ จ๋œ ์ œํ’ˆ ๊ฐ์ฒด๋“ค์ด ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๊ณ , ์ด ์ œ์•ฝ์ด ์™ธ๋ถ€์—์„œ๋„ ์ง€์ผœ์ง€๊ณ  ์‹ถ์„ ๋•Œ

๊ตฌ์กฐ

  • ์œˆ๋„์šฐ, ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์— ๋งž์ถ”์–ด, Button, TextEdit, CheckBox UIComponent๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณธ๋‹ค.

์ฐธ์—ฌ์ž

  • AbstractFactory(ComponentFactory): ๊ฐœ๋…์  ์ œํ’ˆ์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•จ
  • ConcreteFactory(WindowsFactory, LinuxFactory): ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•จ
  • AbstractProduct(Button, CheckBox, TextEdit): ๊ฐœ๋…์  ์ œํ’ˆ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•จ
  • ConcreteFactory(WindowsButton, LinuxButton): ๊ตฌ์ฒด์ ์œผ๋กœ ํŒฉํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•  ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•จ
  • Client: AbstractFactory์™€ AbstractProduct์— ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•จ

ํ˜‘๋ ฅ ๋ฐฉ๋ฒ•

  • ConcreteFactory ์ธ์Šคํ„ด์Šค ํ•œ๊ฐœ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋งŒ๋“ค์–ด์ง
  • ConcreteFactory์—์„œ๋Š” ํŠน์ • ๊ตฌํ˜„์„ ๊ฐ–๋Š” ์ œํ’ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ
  • ์„œ๋กœ ๋‹ค๋ฅธ ์ œํ’ˆ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ConcreteFactory ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ
  • AbstractFactory๋Š” ์–ด๋–ค ์ œํ’ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ConcreteFactory๋กœ ์œ„์ž„ํ•จ

๊ฒฐ๊ณผ

Pros

  1. ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.
    • ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์กฐ์ž‘ํ•œ๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์ฒด ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„์—์„œ ๋ถ„๋ฆฌ๋œ๋‹ค.
  2. ์ œํ’ˆ๊ตฐ์„ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์–ด๋–ค ๊ตฌ์ฒด ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ƒ์— ๋”ฐ๋ผ ์ œํ’ˆ๊ตฐ์„ ํ•œ๋ฒˆ์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์ œํ’ˆ ์‚ฌ์ด์— ์ผ๊ด€์„ฑ์„ ์ฆ์ง„์‹œํ‚จ๋‹ค.
    • ํ•˜๋‚˜์˜ ๊ตฌ์ฒด ํŒฉํ† ๋ฆฌ์—์„œ ๊ทธ ๋งฅ๋ฝ์— ๋งž๋Š” ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€์„ฑ์ด ์ƒ๊ธด๋‹ค.

Cons

  1. ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์ œํ’ˆ์„ ์ œ๊ณตํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
    • ๋งŒ์•ฝ macOS์—์„œ๋งŒ imageView๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•˜์ž.
    • ์ถ”์ƒ ํด๋ž˜์Šค์— createImageView๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, ๋‹ค๋ฅธ ์ œํ’ˆ๊ตฐ์—์„œ๋„ ์ด๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
      • ๋ฌผ๋ก  ๋ฐฉ๋ฒ•์€ ์žˆ์ง€๋งŒ ์ผ๋‹จ์€..
    • ์ฆ‰, ์ƒ์„ฑ๋˜๋Š” ์ œํ’ˆ์€ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ œํ’ˆ ์ง‘ํ•ฉ์— ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค.
    • ํ˜น์€ ๋ฐ˜ํ™˜๋˜๋Š” ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฅผ ์ฑ„ํƒ(ํ˜น์€ ์–ธ์–ด์—๋”ฐ๋ผ ์ƒ์†)๋ฐ›๋Š” ์„œ๋ธŒ ํด๋ž˜์Šค ๋ชจ๋‘ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ์‹œ

  • Github: DesignPattern: AbstractFactory์—์„œ commit์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์ฝ์œผ๋ฉด ๋„์›€์ด ๋œ๋‹ค.
  • ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ์ œํ’ˆ๊ตฐ(MacOS)๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

  • ์ด์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ํ™˜๊ฒฝ์— ๋…๋ฆฝ์ ์ธ ์‹œ์Šคํ…œ์ด ๊ฐ–์ถ”์–ด์กŒ๋‹ค.

์ž˜ ์•Œ๋ ค์ง„ ์‚ฌ์šฉ์˜ˆ

  • โ€Kitโ€์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋“ค์–ด๋ณด์•˜๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  • ์ฆ‰, OOKit์€ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์ด๋‹ค.

๊ด€๋ จ ํŒจํ„ด

  • AbstractFactory ํด๋ž˜์Šค๋Š” 06. Factory Method pattern์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ๋‹ค.
  • 07. Prototype์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.
  • ConcreteFactory๋Š” 08. Singleton์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

Reference