U E D R , A S I H C RSS

Gof/Abstract Factory


1. Abstract Factory

1.1. Intent

ꡬ체적인 ν΄λž˜μŠ€λΌ μ •μ˜ν•˜μ§€ μ•Šκ³ μ„œ, μ—°κ΄€λ˜κ±°λ‚˜ 의쑴적인 객체집합을 λ§Œλ“€μˆ˜ μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λΌ μ œκ³΅ν•œλ‹€.

1.2. Also Known As

Kit

1.3. Motivation

μœ μ €μΈν„°νŽ˜μ΄μŠ€ νˆ΄ν‚·μ€ λ‹€μ–‘ν•œ 룩앀필 κΈ°μ€μ„ μ œκ³΅ν•˜λ„λ‘ κ³ λ €ν•œλ‹€. λ‹€λ₯Έ 룩앀필은 μŠ€ν¬λ‘€λ°”, μœˆλ„μš°, 그리고 λ²„νŠΌμ²˜λŸΌ λ‹€λ₯Έ λͺ¨μŠ΅κ³Ό ν–‰λ™μ–‘μ‹μ˜ μœ μ € μΈν„°νŽ˜μ΄μŠ€ Widget을 μ œκ³΅ν•œλ‹€. 이식가λŠ₯ν•œ 룩앀필 κΈ°μ€μ„ μœ„ν•΄μ„œλŠ”, κ°œλ³„μ  룩앀필 Widget을 μœ„ν•œ μ–΄λ–€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν•˜λ“œ-μ½”λ“œ κ°€ μ•„λ‹ˆμ–΄μ•Ό ν•œλ‹€. μ¦‰μ„μœΌλ‘œ μ •μ˜ν•œ 룩앀필 ν΄λž˜μŠ€λŠ” λ‚˜μ€‘μ— 룩앀필을 λ°”κΎΈκΈ° μ–΄λ ΅κ²Œ λ§Œλ“ λ‹€.

이 λ¬Έμ œλŠ” 기본적인 Widget의 μΈν„°νŽ˜μ΄μŠ€λΌ μ •μ˜ν•œ abstract WidgetFactory ν΄λž˜μŠ€λΌ μ •μ˜ν•¨μœΌλ‘œμ¨ ν•΄κ²°ν•  수 μžˆλ‹€. λ˜ν•œ λͺ¨λ“  μ’…λ₯˜μ˜ Widgetμ—λŠ” μΆ”μƒν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•œλ‹€, 그리고 ꡬ체적인 μ„œλΈŒ ν΄λž˜μŠ€λŠ” Widget을 μƒμ†ν•΄μ„œ 룩앀필 기본을 μ •μ˜ν•œλ‹€. WidgetFactory의 μΈν„°νŽ˜μ΄μŠ€λŠ” 각각의 좔상 Widget 클래슀의 μƒˆλ‘œμš΄ κ°μ²΄λΌ λ°˜ν™˜ν•˜λŠ” κΈ°λŠ₯을 가지고 μžˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” 이런 κΈ°λŠ₯을 μˆ˜ν–‰ν•΄μ„œ Widget μΈμŠ€ν„΄μŠ€λΌ λ§Œλ“ λ‹€. κ·ΈλŸ¬λ‚˜ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ‚¬μš©ν•˜λŠ” 클래슀의 ꡬ체적인 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” 신경쓰지 μ•ŠλŠ”λ‹€. 이처럼 ν΄λΌμ΄μ–ΈνŠΈλŠ” 일반적인(?) λ£©μ•€ν•„μ˜ 독립성에 μ˜μ‘΄ν•œλ‹€.


각각의 λ£©μ•€ν•„μ—λŠ” ν•΄λ‹Ήν•˜λŠ” WidgetFactory의 μ„œλΈŒν΄λž˜μŠ€κ°€ μžˆλ‹€. 각각의 μ„œλΈŒν΄λž˜μŠ€λŠ” ν•΄λ‹Ή λ£©μ•€ν•„μ˜ κ³ μœ ν•œ widget을 생성할 수 μžˆλŠ” κΈ°λŠ₯이 μžˆλ‹€. μ˜ˆλΌ λ“€λ©΄, MotifWidgetFactory의 CreateScrollBarλŠ” Motif μŠ€ν¬λ‘€λ°” μΈμŠ€ν„΄μŠ€λΌ μƒμ„±ν•˜κ³  λ°˜ν™˜ν•œλ‹€, 이 μˆ˜ν–‰μ΄ 일어날 λ™μ•ˆ PMWidgetFactory μƒμ—μ„œ Presentation Manager λΌ μœ„ν•œ μŠ€ν¬λ‘€λ°”λΌ λ°˜ν™˜ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” WidgetFactory μΈν„°νŽ˜μ΄μŠ€λΌ ν†΅ν•΄ 개개의 룩앀필에 ν•΄λ‹Ήν•œλŠ” ν΄λž˜μŠ€μ— λŒ€ν•œ 정보 없이 ν˜Όμžμ„œ widget듀을 μƒμ„±ν•˜κ²Œ λœλ‹€. 달리 λ§ν•˜μžλ©΄, ν΄λΌμ΄μ–ΈνŠΈλŠ” 개개의 ꡬ체적인 ν΄λž˜μŠ€κ°€ μ•„λ‹Œ μΆ”μƒν΄λž˜μŠ€μ— μ˜ν•΄ μ •μ˜λœ μΈν„°νŽ˜μ΄μŠ€μ— μΌμž„ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€λŠ” λœ»μ΄λ‹€.

λ˜ν•œ WidgetFactoryλŠ” widget 클래슀 κ°„μ˜ μ˜μ‘΄κ΄€κ³„λΌ ν˜•μ„±ν•œλ‹€. Motif μŠ€ν¬λ‘€λ°”λŠ” Motif λ²„νŠΌκ³Ό Motif ν…μŠ€νŠΈ 에디터와 ν•¨κ»˜ μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€, 그리고 MotifWidgetFactoryλΌ μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ΄λŸ¬ν•œ μ˜μ‘΄μ„±μ΄ κ°•μ œμ μœΌλ‘œ μ΄λ£¨μ–΄μ§€κ²Œ λœλ‹€.

1.4. Applicability

이럴 λ•Œ Abstract Factory νŒ¨ν„΄μ„ μ‚¬μš©ν•΄λΌ
  • μ‹œμŠ€ν…œμ΄ 뢀산물을 λ§Œλ“€κ³ , μž‘μ„±ν•˜κ³ , 그리고 λ³΄μ—¬μ§€λŠ” 것과 독립적이어야 ν•  λ•Œ.
  • μ‹œμŠ€ν…œμ΄ λ‹€μ–‘ν•œ λΆ€μ‚°λ¬Όμ˜ 집합을 κ³ λ €ν•΄μ•Ό ν•  λ•Œ.
  • μ–΄λ–€ μ—°κ΄€λœ μ§‘ν•©μ˜ 객체듀이 μ„œλ‘œ 같이 μ‚¬μš©λ  수 μžˆλ„λ‘ λ””μžμΈλ˜μ–΄μ§€κ²Œ κ°•μ œν•΄μ•Ό ν•  λ•Œ.
  • 클래슀 λΌμ΄λΈŒλŸ¬λ¦¬λΌ λ‚˜λˆ„κ³  μ‹Άκ³ , μΈν„°νŽ˜μ΄μŠ€λ§Œμ„ λ“œλŸ¬λ‚΄λ˜, 클래슀의 λ™μž‘μ„ 보이지 μ•Šκ³ μž ν•  λ•Œ.

1.6. Participants

  • AbstractFactory(WidgetFactory)
    • 좔상 객체(ProductObject)듀을 λ§Œλ“œλŠ” κΈ°λŠ₯을 μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λΌ μ •μ˜ν•œλ‹€.
  • ConcreteFactory(MotifWidgetFactory, PMWidgetFactory)
    • 객체(ProductObject)λΌ λ§Œλ“œλŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•œλ‹€.
  • AbstractProduct(Window, ScrollBar)
    • μ–΄λ–€ 객체(ProductObject)λΌ μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λΌ μ •μ˜ν•œλ‹€.
  • ConcreteProduct(MotifWindow, MotifScrollBar)
    • νŒ©ν† λ¦¬μ— μƒμ‘ν•˜λŠ” 객체(ProductObject)λΌ μ •μ˜ν•œλ‹€.
    • 좔상 μΈν„°νŽ˜μ΄μŠ€(ProductInterface)λΌ μˆ˜ν–‰ν•œλ‹€.
  • Client
    • AbstractFactory에 μ˜ν•΄μ„œ μ •μ˜λœ μΈν„°νŽ˜μ΄μŠ€μ™€ AbstractProduct ν΄λž˜μŠ€λ§Œμ„ μ‚¬μš©ν•œλ‹€.

1.7. Collaborations

  • λ³΄ν†΅μ˜ 경우 ConcreteFactory 클래슀의 단일 μΈμŠ€ν„΄μŠ€λŠ” μˆ˜ν–‰μ‹œκ°„(run-time)쀑에 μƒμ„±λœλ‹€.
    이 concrete factoryλŠ” νŠΉμ • 상속에 μ˜ν•œ 객체(ProductObject)λΌ λ§Œλ“€μ–΄λ‚Έλ‹€. μ„œλ‘œ λ‹€λ₯Έ 객체(ProductObject)λΌ λ§Œλ“€μ–΄ λ‚΄κΈ° μœ„ν•΄μ„œλŠ”
    ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ‘œ λ‹€λ₯Έ concrete factoryλΌ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • AbstractFactoryλŠ” 객체(ProductObject)의 생성을 ConcreteFactory의 μ„œλΈŒ ν΄λž˜μŠ€μ— μœ„μž„ν•œλ‹€.

1.8. Consequences

Abstract Factory νŒ¨ν„΄μ€ λ‹€μŒκ³Ό 같은 μž₯점과 단점이 μžˆλ‹€.
  1. 독립적인 concrete ν΄λž˜μŠ€λ“€. Abstract Factory νŒ¨ν„΄μ€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μƒμ„±ν•œ 였브젝트의 ν΄λž˜μŠ€λΌ μ‘°μ •ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹€.
    factoryκ°€ κ°μ²΄λΌ λ§Œλ“€μ–΄ λ‚΄λŠ”λ° λŒ€ν•œ μˆ˜ν–‰κ³Ό μ±…μž„μ„ μΊ‘μŠν™” ν•˜κΈ° λ•Œλ¬Έμ— μƒμ†ν•œ ν΄λž˜μŠ€λ‘œλΆ€ν„° ν΄λΌμ΄μ–ΈνŠΈκ°€ 독립적일 수 μžˆλ‹€.
    ν΄λΌμ΄μ–ΈνŠΈλŠ” 좔상 μΈν„°νŽ˜μ΄μŠ€λΌ ν†΅ν•΄μ„œ μΈμŠ€ν„΄μŠ€λΌ λ‹€λ£¬λ‹€. concrete facoty의 μˆ˜ν–‰μ—μ„œ μ‚°λ¬Όμ˜ 클래슀 이름은 μ°¨λ‹¨λ˜μ–΄μžˆλ‹€.
    즉 ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ— concrete factoryκ°€ λ‚˜νƒ€λ‚˜μ§€ μ•ŠλŠ”λ‹€.
  2. μ‚°λ¬Όμ˜ 집합간에 μ „ν™˜μ„ μ‰½κ²Œ ν•΄μ€λ‹€. concrete factory의 ν΄λž˜μŠ€λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ— 단 ν•œλ²ˆ, 선언될 λ•Œλ§Œ 쓰인닀.
    μ΄λŠ” conncrete factoryλΌ μ‰½κ²Œ μ „ν™˜ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ£Όκ³ . 이둜써 κ°„λ‹¨ν•˜κ²Œ concrete factory만 λ°”κΏ”μ€ŒμœΌλ‘œμ„œ μ„œλ‘œλ‹€λ₯Έ μ‚°λ¬Όμ˜ 쑰건을 μ‰½κ²Œ μ“Έμˆ˜ μžˆλ‹€.
    abstract factoryλŠ” μ™„λ²½ν•œ μ‚°λ¬Όμ˜ 집합을 생성해 λ‚΄κ²Œλ˜μ–΄, λͺ¨λ“  μ‚°λ¬Όμ˜ 집합이 ν•œλ²ˆμ— λ°”λ€” 수 있게 ν•œλ‹€(κ°™μ€ν˜•νƒœμ˜ λ‹€λ₯Έ λͺ¨μŠ΅λ“€μ΄λ€λ‘œ.. μ—­μž μ£Ό).
    UI μ˜ˆμ œμ—μ„œ Motif widgets을 Presentation Manager widgets둜 λ°”κΎΈλŠ” μž‘μ—…μ„ 단지 μœ μ‚¬ν•œ νŒ©ν† λ¦¬μ˜ 객체와 λ°”κΏ”μ£Όκ³  κ·Έ μΈν„°νŽ˜μ΄μŠ€λΌ λ‹€μ‹œ μƒμ„±ν•¨μœΌλ‘œμ¨ ν–‰ν•  수 μžˆλ‹€.
  3. μ‚°λ¬Όκ°„μ˜ 일관성을 μ΄‰μ§„ν•œλ‹€. μ–΄λ–€ μ§‘ν•©λ‚΄μ˜ 객체듀이 μ„œλ‘œ ν˜‘λ ₯ν•˜λ„λ‘ κ³ μ•ˆλ˜μ—ˆλ‹€λ©΄, μ–΄λ–€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν•œλ²ˆμ— 단 ν•˜λ‚˜μ˜ μ§‘ν•©μ—μ„œ κ°μ²΄λΌ μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.
    AbstractFactoryλŠ” 이것을 μ‰½κ²Œ ν•œλ‹€.
  4. μƒˆλ‘œμš΄ 산물을 μ§€μ›ν•˜λŠ” 것이 μ–΄λ ΅λ‹€. abstract factory듀을 ν™•μž₯ν•΄μ„œ μƒˆλ‘œμš΄ 산물을 μƒμ„±ν•˜λŠ” 것은 쉽지 μ•Šλ‹€.
    μ™œλƒν•˜λ©΄ AbstractFactory μΈν„°νŽ˜μ΄μŠ€λŠ” μƒμ‚°λ˜μ–΄μ§ˆ μ‚°λ¬Όμ˜ 집합을 고정해놓기 λ•Œλ¬Έμ΄λ‹€. μƒˆλ‘œμš΄ 산물을 μ§€μ›ν•˜λŠ” λ°λŠ” factory의 μΈν„°νŽ˜μ΄μŠ€λΌ ν™•μž₯ν•  ν•„μš”κ°€ μžˆλ‹€
    (AbstractFactory ν΄λž˜μŠ€μ™€ λͺ¨λ“  μ„œλΈŒ ν΄λž˜μŠ€λ“€μ„ λ°”κΎΈλŠ”κ²ƒμ„ ν¬ν•¨ν•΄μ„œ). Implementation λΆ€λΆ„μ—μ„œ 이것에 λŒ€ν•œ ν•œκ°€μ§€ 해결점에 λŒ€ν•΄ λ…Όμ˜ ν•  것이닀.

1.9. Implementation

1.10. Sample Code

1.11. Known Uses

InterViews λŠ” AbstractFactory ν΄λž˜μŠ€λ“€μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄μ„œ 'Kit'λΌ μ ‘λΈμ‚¬λ‘œ μ‚¬μš©ν•œλ‹€. 이것은 WidgetKitκ³Ό DialogKit abstract factory 듀을 λͺ…ν™•ν•œ 룩앀필 UI κ°μ²΄λΌ μœ„ν•΄μ„œ μ •μ˜ν•œλ‹€. InterViewsλŠ” λ˜ν•œ μ„œλ‘œ λ‹€λ₯Έ 볡합 κ°μ²΄λΌ μƒμ„±ν•˜λŠ” LayoutKit 을 포함닀. μ˜ˆλΌ λ“€λ©΄, μ–΄λ–€ layout은 λ¬Έμ„œμ˜ λ°©ν–₯(μΈλ¬Όμ΄λ‚˜ 풍경)에 λ”°λ₯Έ μ„œλ‘œ λ‹€λ₯Έ 볡합 κ°μ²΄λΌ κ°œλ…μ μœΌλ‘œ μ •λ ¬ν•œλ‹€.

ET++WGM88은 λ‹€λ₯Έ μœˆλ„μš° μ‹œμŠ€ν…œ(μ˜ˆλΌ λ“€λ©΄, X Windows 와 SunViews)κ°„μ˜ ν˜Έν™˜μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄μ„œ Abstract Factory νŒ¨ν„΄μ„ μ‚¬μš©ν–ˆλ‹€. μœˆλ„μš° μ‹œμŠ€ν…œμ˜ 좔상 base ν΄λž˜μŠ€λŠ” μœˆλ„μš°μ‹œμŠ€ν…œμ˜ μžμ› 객체(μ˜ˆλΌ λ“€λ©΄, MakeWindow, MakeFont, MakeColor)λΌ μƒμ„±ν•  수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λΌ μ •μ˜ν•œλ‹€. Concrete μ„œλΈŒ ν΄λž˜μŠ€λŠ” νŠΉμ • μœˆλ„μš° μ‹œμŠ€ν…œμ— μΈν„°νŽ˜μ΄μŠ€λΌ μˆ˜ν–‰ν•œλ‹€.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:18
Processing time 0.0522 sec