DesignPattern #생성

κ³½μ„œν˜„Β·2022λ…„ 11μ›” 14일
0

🟣 λ””μžμΈ νŒ¨ν„΄μ΄λž€?

ν”„λ‘œκ·Έλž¨μ„ 섀계할 λ•Œ 자주 λ°œμƒν–ˆλ˜ λ¬Έμ œμ λ“€μ„ ν”Όν•˜κΈ° μœ„ν•΄ ν•˜λ‚˜μ˜ 'κ·œμ•½' ν˜•νƒœλ‘œ λ§Œλ“€μ–΄ 놓은 섀계 νŒ¨ν„΄.

🟣 μ‚¬μš© 이유

λ””μžμΈ νŒ¨ν„΄μ„ μ°Έκ³ ν•˜μ—¬ κ°œλ°œν•  경우 개발의 νš¨μœ¨μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±, μš΄μš©μ„±μ΄ 높아지며 ν”„λ‘œκ·Έλž¨μ˜ μ΅œμ ν™”μ— 도움이 λœλ‹€.

🟣 λ””μžμΈ νŒ¨ν„΄ μœ ν˜•

λͺ©μ μ— 따라 생성, ꡬ쑰, ν–‰μœ„ νŒ¨ν„΄μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.
생성 νŒ¨ν„΄μ€ 객체 μΈμŠ€ν„΄μŠ€ 생성에 κ΄€μ—¬ν•˜λ©° 클래슀 μ •μ˜μ™€ 객체 생성 방식을 ꡬ쑰화, μΊ‘μŠν™” ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.
ꡬ쑰 νŒ¨ν„΄μ€ 더 큰 ꡬ쑰 ν˜•μ„± λͺ©μ μœΌλ‘œ ν΄λž˜μŠ€λ‚˜ 객체의 쑰합을 닀루며
ν–‰μœ„ νŒ¨ν„΄μ€ ν΄λž˜μŠ€λ‚˜ 객체듀이 μƒν˜Έμž‘μš©ν•˜λŠ” 방법과 μ—­ν•  뢄담을 λ‹€λ£¨λŠ” νŒ¨ν„΄μ„ μ˜λ―Έν•œλ‹€.

[ 생성 νŒ¨ν„΄ : 5개 ]

βœ… 싱글톀 νŒ¨ν„΄

πŸ“Œ κ°œλ…
싱글톀 νŒ¨ν„΄(Singleton pattern)은 μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  객체λ₯Ό ν•˜λ‚˜λ§Œ μƒμ„±ν•˜λ„λ‘ ν•˜λ©°, μƒμ„±λœ 객체λ₯Ό μ–΄λ””μ—μ„œλ“ μ§€ μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. (1 클래슀 1 객체)

πŸ“Œ μž₯점

  • ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ 놓고 ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό λ‹€λ₯Έ λͺ¨λ“ˆλ“€μ΄ κ³΅μœ ν•˜λ©° μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ 생성에 λ“œλŠ” λΉ„μš©μ„ 쀄일 수 μžˆλ‹€.
  • λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό λ°©μ§€ν•œλ‹€.
  • λ‹€λ₯Έ 클래슀의 μΈμŠ€ν„΄μŠ€λ“€μ΄ 데이터λ₯Ό κ³΅μœ ν•˜κΈ° 쉽닀.

πŸ“Œ 단점

  • λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ 생성됨을 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 싱글톀 μΈμŠ€ν„΄μŠ€κ°€ λ„ˆλ¬΄ λ§Žμ€ 일을 ν•˜κ±°λ‚˜ λ§Žμ€ 데이터λ₯Ό κ³΅μœ μ‹œν‚¬ 경우 λͺ¨λ“ˆ κ°„μ˜ 결합을 κ°•ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.
  • ν…ŒμŠ€νŠΈ(TDD)μ—μ„œ λ¬Έμ œκ°€ λœλ‹€. λ‹¨μœ„ ν…ŒμŠ€νŠΈμ—μ„œ ν…ŒμŠ€νŠΈκ°€ μ„œλ‘œ 독립적이어야 ν•˜λ©° ν…ŒμŠ€νŠΈλ₯Ό μ–΄λ–€ μˆœμ„œλ‘œλ“  μ‹€ν–‰ν•  수 μžˆμ–΄μ•Ό ν•˜λŠ”λ°, 싱글톀 μΈμŠ€ν„΄μŠ€λŠ” μžμ›μ„ κ³΅μœ ν•˜κ³  있기 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈκ°€ κ²°μ •μ μœΌλ‘œ 격리된 ν™˜κ²½μ—μ„œ μˆ˜ν–‰λ˜λ €λ©΄ 맀번 μΈμŠ€ν„΄μŠ€μ˜ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”μ‹œμΌœμ€˜μ•Ό ν•œλ‹€.
# 보톡, 싱글톀 객체의 .get_instance() 둜 μΈμŠ€ν„΄μŠ€λ₯Ό λ°›μ•„μ˜¨λ‹€.
singleton_1 = Singleton.get_instance()
singleton_2 = Singleton.get_instance()

# μ΄λ ‡κ²Œ λ°›μ•„μ˜¨ 두 μΈμŠ€ν„΄μŠ€λŠ” λ™μΌν•œ μΈμŠ€ν„΄μŠ€λ‹€.
singleton_1 == singleton_2  # True

βœ… ν”„λ‘œν† νƒ€μž…(Prototype) νŒ¨ν„΄

πŸ“Œ κ°œλ…
기쑴의 μΈμŠ€ν„΄μŠ€λ₯Ό κ·ΈλŒ€λ‘œ 볡제(clone) ν•˜μ—¬ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법이닀. (싱글톀과 λ°˜λŒ€κ°œλ…)

πŸ“Œ μž₯점

  • 객체λ₯Ό 생성해주기 μœ„ν•œ λ³„λ„μ˜ 객체 생성 ν΄λž˜μŠ€κ°€ ν•„μš”ν•˜μ§€ μ•Šλ‹€.
  • 객체의 각 뢀뢄을 μ‘°ν•©ν•΄μ„œ μƒμ„±λ˜λŠ” ν˜•νƒœμ—λ„ 적용이 κ°€λŠ₯ν•˜λ‹€.

πŸ“Œ 단점

  • 생성될 κ°μ²΄λ“€μ˜ μžλ£Œν˜•μΈ ν΄λž˜μŠ€λ“€μ΄ λͺ¨λ‘ clone() λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

πŸ“Œ ν™œμš© 상황

  • λŸ°νƒ€μž„μ— μƒˆλ‘œμš΄ 클래슀λ₯Ό μΆ”κ°€ν•˜κ³  μ‚­μ œν•  λ•Œ μœ μš©ν•˜λ‹€.
  • λ™μ μœΌλ‘œ ν΄λž˜μŠ€μ— 따라 μ‘μš©ν”„λ‘œκ·Έλž¨μ„ μ„€μ •ν•΄μ•Ό ν•  λ•Œ μœ μš©ν•˜λ‹€.

μžλ°”μ—μ„œ Stack Memory & Heap Memory

https://jiwondev.tistory.com/86

# 보톡, ν”„λ‘œν† νƒ€μž… 객체의 .clone() 으둜 μΈμŠ€ν„΄μŠ€λ₯Ό λ³΅μ‚¬ν•œλ‹€.
original = Prototype()
prototype = original.clone()

# μ΄λ ‡κ²Œ λ°›μ•„μ˜¨ 두 μΈμŠ€ν„΄μŠ€λŠ” λ™μΌν•œ κ°μ²΄λŠ” μ•„λ‹ˆμ§€λ§Œ, λ‚΄λΆ€ λ°μ΄ν„°λŠ” κ°™λ‹€.
original == prototype  # False
original.data == prototype.data  # True


βœ… νŒ©ν† λ¦¬λ©”μ„œλ“œ(Factory Method) νŒ¨ν„΄

πŸ“Œ κ°œλ…
상속 관계에 μžˆλŠ” 두 ν΄λž˜μŠ€μ—μ„œ μƒμœ„ ν΄λž˜μŠ€κ°€ μ€‘μš”ν•œ λΌˆλŒ€(μΈν„°νŽ˜μ΄μŠ€)λ₯Ό κ²°μ •ν•˜κ³ , ν•˜μœ„ ν΄λž˜μŠ€κ°€ 객체 생성에 κ΄€ν•œ ꡬ체적인 λ‚΄μš©(μΈμŠ€ν„΄μŠ€ 생성)을 κ²°μ •ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

πŸ“Œ μž₯점

  • μƒμœ„ ν΄λž˜μŠ€κ°€ ν•˜μœ„ ν΄λž˜μŠ€μ™€ λΆ„λ¦¬λ˜κΈ° λ•Œλ¬Έμ— λŠμŠ¨ν•œ 결합을 κ°€μ§€κ²Œ λœλ‹€.
  • μƒμœ„ ν΄λž˜μŠ€μ—μ„œλŠ” ν•˜μœ„ μΈμŠ€ν„΄μŠ€ 생성 방식에 λŒ€ν•΄ μ „ν˜€ μ•Œ ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— μœ μ—°μ„±μ΄ 높아지며 μœ μ§€λ³΄μˆ˜μ„±μ΄ μ¦κ°€ν•œλ‹€.
  • μˆ˜μ •μ—λŠ” λ‹«ν˜€μžˆκ³  ν™•μž₯μ—λŠ” μ—΄λ €μžˆλ‹€(Open-Closed Principle=OCP 원칙을 지킬 수 있음)

πŸ“Œ 단점

  • ν΄λž˜μŠ€κ°€ λ§Žμ•„μ§„λ‹€.
# 보톡, Factory 객체의 `get` λ©”μ˜λ“œμ˜ νŒŒλΌλ―Έν„°λ‘œ 생성할 객체의 νƒ€μž…μ„ λ„˜κ²¨μ€€λ‹€.
samsung_keyboard = KeyboardFactory.get_keyboard("samsung")
lg_keyboard = KeyboardFactory.get_keyboard("lg")

# μƒμ„±λœ κ°μ²΄λŠ” λ‹€μŒκ³Ό 같이 ꡬ체적인 클래슀 μΈμŠ€ν„΄μŠ€λ‹€.
samsung_keyboard  # SamsungKeyboard
lg_keyboard  # LgKeyboard

βœ… μΆ”μƒνŒ©ν† λ¦¬(Abstract Factory) νŒ¨ν„΄

πŸ“Œ κ°œλ…
ꡬ체적인 클래슀λ₯Ό μ§€μ •ν•˜μ§€ μ•Šκ³  관련성이 μžˆκ±°λ‚˜, 독립적인 객체듀을 μƒμ„±ν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

πŸ“Œ μž₯점

  • νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μˆ˜μ •μ—λŠ” λ‹«ν˜€ 있고 ν™•μž₯μ—λŠ” μ—΄λ €μžˆλ‹€.
  • μ—¬λŸ¬ 개의 λΉ„μŠ·ν•œ 집합 객체 생성을 ν•˜λ‚˜μ˜ νŒ©ν† λ¦¬μ— λͺ¨μ•„λ‘˜ 수 μžˆλ‹€.

πŸ“Œ 단점

  • ν΄λž˜μŠ€κ°€ λ§Žμ•„μ§„λ‹€.

πŸ™„ νŒ©ν† λ¦¬ λ©”μ„œλ“œμ™€ μΆ”μƒνŒ©ν† λ¦¬μ˜ 차이점이 뭔데μš₯?

κ°€μž₯ 큰 차이점은 νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ€ μ–΄λ–€ 객체λ₯Ό 생성할지에 μ§‘μ€‘ν•˜κ³  좔상 νŒ©ν† λ¦¬ νŒ¨ν„΄μ€ μ—°κ΄€λœ 객체(νŒ©ν† λ¦¬)듀을 λͺ¨μ•„λ‘”λ‹€λŠ” 것에 μ§‘μ€‘ν•©λ‹ˆλ‹€.

# ν‚€λ³΄λ“œ νŒ©ν† λ¦¬μ˜ νŒ©ν† λ¦¬(좔상 νŒ©ν† λ¦¬)λ₯Ό 톡해 ν‚€λ³΄λ“œ νŒ©ν† λ¦¬λ₯Ό μ–»λŠ”λ‹€.
CommonKeyboardFactory = AbstarctKeyboardFactory.get_keyboard_factory("common")

# μ΄ν›„λŠ” νŒ©ν† λ¦¬ νŒ¨ν„΄κ³Ό λ™μΌν•˜λ‹€.
samsung_common_keyboard = CommonKeyboardFactory.get_keyboard("samsung")
lg_common_keyboard = CommonKeyboardFactory.get_keyboard("lg")

samsung_keyboard  # SamsungCommonKeyboard
lg_keyboard  # LgCommonKeyboard

βœ… λΉŒλ”(Builder) νŒ¨ν„΄

πŸ“Œ κ°œλ…
λ³΅μž‘ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μ‘°λ¦½ν•˜μ—¬ λ§Œλ“œλŠ” ꡬ쑰둜, 볡합 객체λ₯Ό 생성할 λ•Œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법(κ³Όμ •)κ³Ό 객체λ₯Ό κ΅¬ν˜„(ν‘œν˜„)ν•˜λŠ” 방법을 λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ λ™μΌν•œ 생성 μ ˆμ°¨μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ ν‘œν˜„ κ²°κ³Όλ₯Ό λ§Œλ“€ 수 μžˆλŠ” λ””μžμΈ νŒ¨ν„΄
** get, set, λ©”μ†Œλ“œ λΆ„λ¦¬ν•΄μ„œ λ§Œλ“œλŠ”κ²Œ λΉŒλ”νŒ¨ν„΄!

πŸ“Œ μž₯점

  • 생성 과정이 λ³΅μž‘ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μΌκ΄€λœ ν”„λ‘œμ„ΈμŠ€λ‘œ 생성할 수 μžˆλ‹€.
  • λΉŒλ”μ˜ λ©”μ„œλ“œλ₯Ό 체이닝 ν˜•νƒœλ‘œ ν˜ΈμΆœν•˜λ©° μžμ—°μŠ€λŸ½κ²Œ μΈμŠ€ν„΄μŠ€λ₯Ό κ΅¬μ„±ν•˜κ³  μ΅œμ’…μ μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜λ„λ‘ μœ λ„ν•  수 μžˆλ‹€.
  • 멀버 λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”μ™€ 검증을 각각의 멀버 λ³€μˆ˜λ³„λ‘œ λΆ„λ¦¬ν•΄μ„œ μž‘μ„±ν•  수 μžˆλ‹€.

πŸ“Œ 단점

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” ꡬ체적인 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° 전에 λ°˜λ“œμ‹œ λΉŒλ”λ₯Ό 생성해야 ν•œλ‹€.
  • 관리해야 ν•  ν΄λž˜μŠ€κ°€ λ§Žμ•„μ§€κ³  ꡬ쑰가 λ³΅μž‘ν•˜λ‹€.
Student kangworld = new Student
    .StudentBuilder(32140033)
    .setName("kangworld")
    .setPhoneNumber("010-1234-5678")
    .setGrade("sophomore")
    .getStudent();

0개의 λŒ“κΈ€