728x90
πŸ’‘ 1995λ…„ GoF(Gang of Four)라고 λΆˆλ¦¬λŠ” Erich Gamma, Richard Helm, Ralph Johnson, John Vissidesκ°€ 처음으둜 λ””μžμΈ νŒ¨ν„΄μ„ κ΅¬μ²΄ν™”ν•˜μ˜€λ‹€.GoF의 λ””μžμΈ νŒ¨ν„΄μ€ μ†Œν”„νŠΈμ›¨μ–΄ κ³΅ν•™μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.λͺ©μ μ— 따라 λΆ„λ₯˜ν•  μ‹œ 생성 νŒ¨ν„΄ 5개, κ΅¬μ‘°νŒ¨ν„΄ 7개, ν–‰μœ„ νŒ¨ν„΄ 11개 총 23개의 νŒ¨ν„΄μœΌλ‘œ κ΅¬μ„±λœλ‹€.

🀷‍♂️GoF λ””μžμΈ νŒ¨ν„΄

GoFλ””μžμΈ νŒ¨ν„΄μ„ λΆ„λ₯˜ν•˜λŠ” 기쀀은 두 가지이닀.

  1. λͺ©μ μ— 따라 λΆ„λ₯˜ν•˜λ©΄ 생성 ,ꡬ쑰, 행동 3κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. 각각의 νŒ¨ν„΄μ΄ μ–΄λ–€ 일을 ν•˜κΈ° μœ„ν•œ 것인지에 κ΄€ν•œ 것이닀. 생성 νŒ¨ν„΄μ€ 객체의 생성 과정에 κ΄€μ—¬, ꡬ쑰 νŒ¨ν„΄μ€ 객체의 합성에 κ΄€μ—¬, 행동 νŒ¨ν„΄μ€ 객체가 μƒν˜Έ μž‘μš©ν•˜λŠ” λ°©λ²•μ΄λ‚˜ 관심사λ₯Ό λΆ„λ¦¬ν•˜λŠ” 방법이닀.
  2. λ²”μœ„μ— 따라 λΆ„λ₯˜λ„ κ°€λŠ₯ν•˜λ‹€. νŒ¨ν„΄μ„ 주둜 ν΄λž˜μŠ€μ— μ μš©ν•˜λŠ”μ§€, 객체에 μ μš©ν•˜λŠ” μ§€ κ΅¬λΆ„ν•˜λŠ” 것이닀. 클래슀 νŒ¨ν„΄μ€ ν΄λž˜μŠ€μ™€ μ„œλΈŒ 클래슀 κ°„μ˜ 관령성을 닀룬닀. 주둜 상속을 톡해 κ΄€λ ¨λ˜λ©°, 컴파일 νƒ€μž„μ— μ •μ μœΌλ‘œ κ²°μ •λœλ‹€. 객체 νŒ¨ν„΄μ€ 객체 κ°„μ˜ 관련성을 닀루고, λŸ°νƒ€μž„μ— 변경될 수 μžˆλŠ” 동적인 성격을 κ°€μ§„λ‹€.

 

πŸ”¨μƒμ„± νŒ¨ν„΄

생성 νŒ¨ν„΄μ€ 객체의 생성과 κ΄€λ ¨λœ νŒ¨ν„΄μ΄λ‹€. 객체의 μΈμŠ€ν„΄μŠ€ 과정을 μΆ”μƒν™”ν•˜λŠ” 방법이닀. 객체의 생성과 μ°Έμ‘° 과정을 μΊ‘μŠν™”ν•˜λ©° 객체가 μƒμ„±λ˜κ±°λ‚˜ λ³€κ²½λ˜μ–΄λ„ ν”„λ‘œκ·Έλž¨ ꡬ쑰에 영ν–₯을 λ°›μ§€ μ•Šλ„λ‘ ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ— μœ μ—°μ„±μ„ 더해쀀닀.생성 클래슀 νŒ¨ν„΄μ€ 객체λ₯Ό μƒμ„±ν•˜λŠ” 일뢀λ₯Ό μ„œλΈŒ ν΄λž˜μŠ€κ°€ λ‹΄λ‹Ήν•˜λ„λ‘ ν•˜λ©°, 생성 객체 νŒ¨ν„΄μ€ 객체 생성을 λ‹€λ₯Έ κ°μ²΄μ—κ²Œ μœ„μž„ν•œλ‹€.

좔상 νŒ©ν† λ¦¬(Abstract Factory) ꡬ체적인 클래슀λ₯Ό μ§€μ •ν•˜μ§€ μ•Šκ³  μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 μ„œλ‘œ μ—°κ΄€λ˜λŠ” 객체듀을 그룹으둜 ν‘œν˜„ν•¨
λΉŒλ”(Builder) 볡합 객체의 생성과 ν‘œν˜„μ„ λΆ„λ¦¬ν•˜μ—¬ λ™μΌν•œ 생성 μ ˆμ°¨μ—μ„œλ„ λ‹€λ₯Έ ν‘œν˜„ κ²°κ³Όλ₯Ό λ§Œλ“€μ–΄λ‚Ό 수 있음
νŒ©ν† λ¦¬ λ©”μ†Œλ“œ(Factory Method) 객체 생성을 μ„œλΈŒν΄λž˜μŠ€λ‘œ μœ„μž„ν•˜μ—¬ μΊ‘μŠν™”ν•¨
ν”„λ‘œν† νƒ€μž…(Prototype) 원본 객체λ₯Ό λ³΅μ‚¬ν•¨μœΌλ‘œμ¨ 객체λ₯Ό 생성함
싱글톀(Singleton) μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” ν•˜λ‚˜μž„μ„ 보μž₯ν•˜κ³  μ–΄λ””μ„œλ“  μ°Έμ‘°ν•  수 μžˆλ„λ‘ 함

 

πŸ”¨κ΅¬μ‘° νŒ¨ν„΄

ꡬ쑰 νŒ¨ν„΄μ€ ν΄λž˜μŠ€λ‚˜ 객체듀을 μ‘°ν•©ν•΄ 더 큰 ꡬ쑰둜 λ§Œλ“€ 수 있게 ν•΄μ£ΌλŠ” νŒ¨ν„΄μ΄λ‹€. ꡬ쑰 클래슀 νŒ¨ν„΄μ€ 상속을 톡해 ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•©μ„±ν•˜κ³ , ꡬ쑰 객체 νŒ¨ν„΄μ€ 객체λ₯Ό ν•©μ„±ν•˜λŠ” 방법을 μ •μ˜ν•œλ‹€.

μ–΄λŒ‘ν„°(Adapter) 클래슀의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ³€ν™˜ν•˜μ—¬ λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ μ΄μš©ν•  수 μžˆλ„λ‘ 함
λΈŒλ¦¬μ§€(Bridge) κ΅¬ν˜„λΆ€μ—μ„œ 좔상측을 λΆ„λ¦¬ν•˜μ—¬ 각자 λ…λ¦½μ μœΌλ‘œ ν™•μž₯ν•  수 있게 함
μ»΄ν¬μ§€νŠΈ(Composite) κ°μ²΄λ“€μ˜ 관계λ₯Ό 트리 ꡬ쑰둜 κ΅¬μ„±ν•˜μ—¬ 볡합 객체와 단일 객체λ₯Ό ꡬ뢄없이 λ‹€λ£Έ
λ°μ½”λ ˆμ΄ν„°(Decorator) μ£Όμ–΄μ§„ 상황 및 μš©λ„μ— 따라 μ–΄λ–€ 객체에 λ‹€λ₯Έ 객체λ₯Ό λ§λΆ™μ΄λŠ” 방식
νΌμ‹Έλ“œ(Facade) μ„œλΈŒμ‹œμŠ€ν…œμ— μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€ 집합에 λŒ€ν•΄ ν•˜λ‚˜μ˜ ν†΅ν•©λœ μΈν„°νŽ˜μ΄μŠ€(Wrapper) 제곡
ν”ŒλΌμ΄μ›¨μ΄νŠΈ(Flyweight) 크기가 μž‘μ€ μ—¬λŸ¬ 개의 객체λ₯Ό 맀번 μƒμ„±ν•˜μ§€ μ•Šκ³  κ°€λŠ₯ν•œ ν•œ κ³΅μœ ν•  수 μžˆλ„λ‘ ν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•¨
ν”„λ‘μ‹œ(Proxy) 접근이 μ–΄λ €μš΄ 객체둜의 접근을 μ œμ–΄ν•˜κΈ° μœ„ν•΄ 객체의 Surrogateλ‚˜ Placeholderλ₯Ό 제곡

 

πŸ”¨ν–‰μœ„ νŒ¨ν„΄

ν–‰μœ„ νŒ¨ν„΄μ€ ν΄λž˜μŠ€λ‚˜ 객체듀이 μ„œλ‘œ μƒν˜Έμž‘μš©ν•˜λŠ” λ°©λ²•μ΄λ‚˜ μ–΄λ–€ νƒœμŠ€ν¬, μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μ„ μ–΄λ–€ 객체에 ν• λ‹Ήν•˜λŠ” 것이 쒋을지λ₯Ό μ •μ˜ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€. 즉, κ°μ²΄λ‚˜ 클래슀의 ꡐλ₯˜ 방법에 λŒ€ν•΄ μ •μ˜ν•˜λŠ” 것이닀. ν–‰μœ„ νŒ¨ν„΄μ€ ν•˜λ‚˜μ˜ 객체둜 μˆ˜ν–‰ν•  수 μ—†λŠ” μž‘μ—…μ„ μ—¬λŸ¬ 객체둜 λΆ„λ°°ν•˜λ©΄μ„œ κ·Έλ“€ κ°„μ˜ 결합도λ₯Ό μ΅œμ†Œν™” ν•  수 μžˆλ„λ‘ 도와쀀닀. ν–‰μœ„ 클래슀 νŒ¨ν„΄ 은 상속을 톡해 μ•Œκ³ λ¦¬μ¦˜κ³Ό μ œμ–΄ 흐름을 κΈ°μˆ ν•˜κ³ , ν–‰μœ„ 객체 ν•΄ν„΄ 은 ν•˜λ‚˜μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 객체 집합이 μ–΄λ–»κ²Œ ν˜‘λ ₯ν•˜λŠ”μ§€λ₯Ό κΈ°μˆ ν•œλ‹€.

μ±…μž„ 연쇄(Chain of Responsibility) μš”μ²­μ„ λ°›λŠ” 객체λ₯Ό μ—°μ‡„μ μœΌλ‘œ λ¬Άμ–΄ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 객체λ₯Ό λ§Œλ‚  λ•ŒκΉŒμ§€ 객체 Chain을 따라 μš”μ²­μ„ 전달함
μ»€λ§¨λ“œ(Command) μš”μ²­μ„ 객체의 ν˜•νƒœλ‘œ μΊ‘μŠν™”ν•˜μ—¬ μž¬μ‚¬μš©ν•˜κ±°λ‚˜ μ·¨μ†Œν•  수 μžˆλ„λ‘ μ €μž₯함
인터프리터(Interpreter) νŠΉμ • μ–Έμ–΄μ˜ 문법 ν‘œν˜„μ„ μ •μ˜ν•¨
반볡자(Iterator) λ‚΄λΆ€λ₯Ό λ…ΈμΆœν•˜μ§€ μ•Šκ³  접근이 μž¦μ€ μ–΄λ–€ 객체의 μ›μ†Œλ₯Ό 순차적으둜 μ ‘κ·Όν•  수 μžˆλŠ” λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€ 제곡
μ€‘μž¬μž(Mediator) ν•œ 집합에 μ†ν•΄μžˆλŠ” κ°μ²΄λ“€μ˜ μƒν˜Έμž‘μš©μ„ μΊ‘μŠν™”ν•˜μ—¬ μƒˆλ‘œμš΄ 객체둜 μ •μ˜
λ©”λ©˜ν† (Memento) 객체가 νŠΉμ • μƒνƒœλ‘œ λ‹€μ‹œ λ˜λŒμ•„μ˜¬ 수 μžˆλ„λ‘ λ‚΄λΆ€ μƒνƒœλ₯Ό 싀체화
μ˜΅μ„œλ²„(Observer) 객체 μƒνƒœκ°€ λ³€ν•  λ•Œ κ΄€λ ¨ 객체듀이 κ·Έ λ³€ν™”λ₯Ό 톡지받고 μžλ™μœΌλ‘œ 갱신될 수 있게 함
μƒνƒœ(State) 객체의 μƒνƒœμ— 따라 λ™μΌν•œ λ™μž‘μ„ λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•΄μ•Όν•  λ•Œ μ‚¬μš©
μ „λž΅(Strategy) 동일 κ³„μ—΄μ˜ μ•Œκ³ λ¦¬μ¦˜κ΅°μ„ μ •μ˜ν•˜κ³  μΊ‘μŠν™”ν•˜μ—¬ μƒν˜Έκ΅ν™˜μ΄ κ°€λŠ₯ν•˜λ„λ‘ 함
ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ(Template Method) μƒμœ„ν΄λž˜μŠ€λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ κ³¨κ²©λ§Œμ„ μž‘μ„±ν•˜κ³  ꡬ체적인 μ²˜λ¦¬λŠ” μ„œλΈŒν΄λž˜μŠ€λ‘œ μœ„μž„ν•¨
방문자(Visitor) 객체의 μ›μ†Œμ— λŒ€ν•΄ μˆ˜ν–‰ν•  연산을 λΆ„λ¦¬ν•˜μ—¬ λ³„λ„μ˜ 클래슀둜 ꡬ성함
728x90