A A
[Design Pattern] Abstract Factory Pattern - ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

Abstract Factory Pattern 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด(Abstract Factory Pattern)์€ ๊ด€๋ จ์„ฑ์ด ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ƒ์„ฑ ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

  • ์ด ํŒจํ„ด์€ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ •๋ณด ์—†์ด๋„ ์„œ๋กœ ์—ฐ๊ด€๋˜๊ฑฐ๋‚˜ ์˜์กด์ ์ธ ๊ฐ์ฒด์˜ ๊ตฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ๋˜ํ•œ, ํŒฉํ† ๋ฆฌ ์ž์ฒด๋ฅผ ์ถ”์ƒํ™”ํ•จ์œผ๋กœ์จ ๊ฐ์ฒด๋“ค์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  • ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต: ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ด€๋ จ๋œ ๊ฐ์ฒด๋“ค์˜ ์ƒ์„ฑ์„ ์ถ”์ƒํ™”ํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ๋Š” ๊ฐ์ฒด์˜ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค.
  • ์„œ๋กœ ์—ฐ๊ด€๋œ ๊ฐ์ฒด ์ƒ์„ฑ: ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์„œ๋กœ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋“ค์˜ ๊ตฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, GUI ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ๋ฒ„ํŠผ, ํ…์ŠคํŠธ ์ƒ์ž ๋ฐ ์ฒดํฌ๋ฐ•์Šค์™€ ๊ฐ™์€ ๊ด€๋ จ๋œ ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŒฉํ† ๋ฆฌ ์ถ”์ƒํ™”: ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์—์„œ๋Š” ํŒฉํ† ๋ฆฌ ์ž์ฒด๋ฅผ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•Œ ํ•„์š” ์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ฐ์ฒด ์ƒ์„ฑ์— ๋Œ€ํ•œ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ , ๊ด€๋ จ๋œ ๊ฐ์ฒด๋“ค์˜ ๊ตฐ์„ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์˜์กด์„ฑ์„ ๋‚ฎ์ถ”๊ณ , ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

์žฅ์ 

  • ์ถ”์ƒํ™” ์ˆ˜์ค€์—์„œ ์ผ๊ด€์„ฑ: ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ฐ์ฒด ์ƒ์„ฑ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ๋†’์—ฌ, ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ์ƒ์„ฑ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ฑ: ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์‹œ์Šคํ…œ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์ด, ์ƒˆ๋กœ์šด Concrete Factory๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ต์ฒด ์šฉ์˜์„ฑ ๋ฐ ์œ ์—ฐ์„ฑ: ํด๋ผ์ด์–ธํŠธ๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์— ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ Concrete Factory๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด ๊ตฐ์„ ์‰ฝ๊ฒŒ ๊ต์ฒด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

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

Example


๋ฒ„ํŠผ - ๋‹คํฌ, ๋ผ์ดํŠธ

class Button:
    def click(self):
        pass

class DarkButton(Button):
    def click(self):
        print("dark click")

class LightButton(Button):
    def click(self):
        print("light click")

์ฒดํฌ๋ฐ•์Šค - ๋‹คํฌ, ๋ผ์ดํŠธ

class CheckBox:
    def check(self):
        pass

class DarkCheckBox(CheckBox):
    def check(self):
        print("dark check")

class LightCheckBox(CheckBox):
    def check(self):
        print("light check")

์Šคํฌ๋กค - ๋‹คํฌ, ๋ผ์ดํŠธ

class ScrollBar:
    def scroll(self):
        pass

class DarkScrollBar(ScrollBar):
    def scroll(self):
        print("dark scrollbar")

class LightScrollBar(ScrollBar):
    def scroll(self):
        print("light scrollbar")

์ œํ’ˆ ์ƒ์„ฑ (UI Factory)

class UIFactory:
    def getButton(self):
        pass
    
    def getScrollBar(self):
        pass
    
    def getCheckBox(self):
        pass

Dark UI Factory

class DarkUIFactory(UIFactory):
    def getButton(self):
        return DarkButton()
    
    def getScrollBar(self):
        return DarkScrollBar()
    
    def getCheckBox(self):
        return DarkCheckBox()

Light UI Factory

class LightUIFactory(UIFactory):
    def getButton(self):
        return LightButton()
    
    def getScrollBar(self):
        return LightScrollBar()
    
    def getCheckBox(self):
        return LightCheckBox()

Client

# ์‚ฌ์šฉ ์˜ˆ์‹œ
df = DarkFactory()
bt = df.getButton()
ck = df.getCheck()
sc = df.getScroll()
bt.click()
ck.check()
sc.scroll()