loki d 2021. 9. 4. 22:47
728x90

Factory Method Pattern

νŒ¨ν„΄μ˜ λΆ„λ₯˜ : 생성 νŒ¨ν„΄

νŒ¨ν„΄μ˜ λͺ©μ  : This pattern defines an interface for creating an object, but let subclasses decide which class to instantiate. Factory method lets a class defer instantiation to the subclasses. – GoF –

νŒ¨ν„΄μ˜ 적용

  • ν™•μž₯ κ°€λŠ₯ν•œ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ œκ³΅ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•  수 있음
  • κ΅¬ν˜„ κ΄€μ μ—μ„œ μ–΄λ–€ μ’…λ₯˜μ˜ 객체λ₯Ό 생성할지 λ‚˜μ€‘μ— κ²°μ •ν•  수 μžˆλ„λ‘ ν•΄μ€Œ
  • 같은 μƒμœ„ νƒ€μž…μ„ κ°€μ§€λŠ” μ—¬λŸ¬ μ’…λ₯˜μ˜ 객체λ₯Ό 생성해야 ν•˜λ©°, 이듀을 주둜 μƒμœ„ νƒ€μž…μ„ 톡해 μ’†κ°€ν•  경우
  • λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλΌ μžμ‹ ν΄λž˜μŠ€κ°€ μ–΄λ–€ μ’…λ₯˜μ˜ 객체λ₯Ό 생성할지 κ²°μ •ν•  ν•„μš”κ°€ μžˆμ„ 경우 (객체가 has-a둜 μœ μ§€ν•˜λŠ” κ²ƒμ˜ μ’…λ₯˜κ°€ λ‹€λ₯Ό 수 μžˆμ„ λ•Œ, κ·Έ μ’…λ₯˜μ˜ 결정을 ν•˜μœ„ ν΄λž˜μŠ€μ—κ²Œ μœ„μž„ν•  ν•„μš”κ°€ μžˆμ„ λ•Œ)
  • 객체λ₯Ό 생성해야 ν•œλ‹€λŠ” 것은 μ•Œμ§€λ§Œ μ–΄λ–€ μ’…λ₯˜μ˜ 객체λ₯Ό 생성할지 λͺ¨λ₯Ό 경우

νŒ¨ν„΄ 적용 κ°€λŠ₯ μ‹œλ‚˜λ¦¬μ˜€

  • 우편의 배솑은 항곡, μ°¨λŸ‰, κΈ°μ°¨λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.
  • 우편과 κ΄€λ ¨λœ λͺ¨λ“  κΈ°λŠ₯이 Mail ν΄λž˜μŠ€μ— μ •μ˜λ˜μ–΄ μžˆμ„ λ•Œ, 이 클래슀λ₯Ό μƒμ†λ°›λŠ” ν•­κ³΅μš°νŽΈ, μ§€μƒμš°νŽΈμ„ μ •μ˜ν•˜μ—¬ 배솑에 ν•„μš”ν•œ 객체 μƒμ„±λ§Œ λ‹΄λ‹Ήν•˜λ„λ‘ ν•  수 있음

νŒ¨ν„΄μ˜ μ°Έμ—¬μž

  • μƒμ„±μž(creator) : νŒ©ν† λ¦¬ λ©”μ†Œλ“œκ°€ μ„ μ–Έ 및 μ •μ˜λ˜λŠ” 좔상 νƒ€μž…
  • ꡬ체적 μƒμ„±μž(concrete creator) : νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ μ‹€μ œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 클래슀
  • μ œν’ˆ(product) : 생성될 κ°μ²΄λ“€μ˜ 좔상 클래슀 λ˜λŠ” interface
  • ꡬ체적 μ œν’ˆ 클래슀(concrete product) : μ‹€μ œ 생성될 객체의 클래슀

νŒ¨ν„΄μ˜ ꡬ쑰

μŠ€ν¬λ¦°μƒ· 2021-08-07 μ˜€ν›„ 3 51 00

μ°Έμ—¬μžκ°„ ν˜‘λ ₯

  • μƒμ‚°μž ν΄λž˜μŠ€λ‚˜ interfaceλŠ” 객체의 생성을 ν•˜μœ„ ν΄λž˜μŠ€μ— μœ„μž„ν•¨
  • 보톡 μ—­ν• μ˜ 이름과 달리 객체의 생성이 μƒμ‚°μžμ˜ 핡심 역할이 μ•„λ‹˜
  • ꡬ체적 μƒμ‚°μžλŠ” 맀번 객체λ₯Ό 생성해야 ν•˜λŠ” 것은 μ•„λ‹ˆλ©°, 객체 ν’€κ³Ό 같이 λ‹€μ–‘ν•œ 생성 λ‘œμ§μ„ μ‚¬μš©ν•  수 있음

νƒœνŽ€μ˜ κ΅¬ν˜„

  • 생성될 λͺ¨λ“  μ’…λ₯˜μ˜ μ œν’ˆμ΄ 같은 좔상 νƒ€μž…(μ œν’ˆ μ°Έμ—¬μž)을 μ‚¬μš©ν•˜μ—¬μ•Ό 함

νŒ¨ν„΄μ˜ μž₯단점

  • μž₯점
    • 객체λ₯Ό 직접 μƒμ„±ν•˜λŠ” 것보닀 객체λ₯Ό μƒμ„±ν•˜λŠ” μΆ”μƒν™”λœ λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜λŠ” 것이 λ”μš± μœ μ—°ν•œ 방법이며, 이 νŒ¨ν„΄λ„ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλΌλŠ” 것을 μ΄μš©ν•˜μ—¬ 객체λ₯Ό 생성함
    • ν™•μž₯ κ°€λŠ₯ν•œ 객체 생성 ν”„λ ˆμž„μ›Œν¬λ₯Ό λ§Œλ“€ 수 있음 μƒμ‚°μžλŠ” ꡬ체적인 μƒν’ˆμ— λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μ—†μŒ(ꡬ체적 μƒμ‚°μžλŠ” ꡬ체적 μƒν’ˆκ³Ό λ°€μ ‘ν•˜κ²Œ 연결됨)
    • ꡬ체적 μƒμ‚°μžμ˜ 응집성은 맀우 λ†’μŒ
  • 단점
    • μƒˆλ‘œμš΄ μ’…λ₯˜μ˜ 객체λ₯Ό 생성해야 ν•˜λ©΄ κΈ°μ‘΄ ꡬ체적 μ œν’ˆ 클래슀λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•  수 있음
    • μƒμ„±λ˜λŠ” 객체가 μ œν’ˆ 좔상 ν΄λž˜μŠ€λ‚˜ interfaceλ₯Ό 톡해 μ›ν™œν•˜κ²Œ μ‚¬μš©λ  수 μžˆμ§€ μ•ŠμœΌλ©΄ νŒ©ν† λ¦¬ λ©”μ†Œλ“œ νŒ¨ν„΄μ˜ μ‚¬μš©μ΄ νš¨κ³Όμ μ΄μ§€ λͺ»ν•  수 있음
    • ꡬ체적 μƒμ‚°μž ν΄λž˜μŠ€μ™€ ꡬ체적 μ œν’ˆ κ°„μ—λŠ” λ‹¨λ‹¨ν•œ 연결은 λΆˆκ°€ν”Ό