E D R , A S I H C RSS

DPSC Chapter3

Abstract Factory(31)


ABSTRACT FACTORY(DP 87)


Intent

μ—°κ΄€λœ ν˜Ήμ€ 의쑴적인 κ°μ²΄λ“€μ˜ 집합을 λ§Œλ“€κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λΌ μ œκ³΅ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ ꡬ체적인 ν΄λž˜μŠ€λ“€μ— λŒ€ν•œ ꡬ체화
λΌ ν•˜μ§€ μ•Šκ³  μΆ”μƒμ μœΌλ‘œ μ–΄λ–€ μƒν’ˆμ˜ 집합(μ—¬λŸ¬ μ’…λ₯˜μ˜ μžλ™μ°¨λ“€)μ—μ„œ μƒν’ˆ(μžλ™μ°¨)을 λ§Œλ“ λ‹€κ³  ν•˜μž.

Discussion

νŒ¨ν„΄μ€ μ‹€μ œλ‘œ μ•„μ£Ό κ°„λ‹¨ν•˜λ‹€. 문제 상황은 λ§Žμ€ 뢀뢄듀을 ν¬ν•¨ν•œλ‹€. Abstract Factory νŒ¨ν„΄μ΄ 적용될 수 μžˆλŠ” μ˜ˆμ œλΌ λ³΄λ„λ‘
ν•˜μž.

μš°μ„  첫째둜, μš°λ¦¬λŠ” μ»΄ν¬λ„ŒνŠΈμ˜ ν•˜μœ„ λΆ€λΆ„λ“€λ‘œ λΆ€ν„° λ‹¨κ³„λ³„λ‘œ μƒν’ˆ(μžλ™μ°¨)을 λ§Œλ“€ ν•„μš”κ°€ μžˆλŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ–΄λ³΄μž.
그것은 λͺΈμ²΄, 엔진, 변속μž₯치, 그리고 승객 칸막을 ν¬ν•¨ν•˜λŠ” μžλ™μ°¨λΌ λ§Œλ“œλŠ” 것이닀. λ‘˜μ§Έλ‘œ, μ‘μš© ν”„λ‘œκ·Έλž¨μ€ 같은 μƒν’ˆμ˜
뢀뢄듀을 μ›ν•œλ‹€. 즉 Ford μžλ™μ°¨λŠ” Ford 엔진과 변속μž₯μΉ˜λΌ κ°€μ Έμ•Όν•œλ‹€. 이것은 Ford Familyμ•ˆμ˜ 뢀뢄듀이닀. μ…‹μ§Έ, μš°λ¦¬λŠ”
μ—¬λŸ¬ part의 family듀을 가진닀.
Ford parts,Toyota parts,Porsche parts 등등이닀. μœ μ‚¬ν•œ ν΄λž˜μŠ€λ“€μ΄ 클래슀 κ΅¬μ‘°λΌ ν†΅ν•΄μ„œ ν™•μž₯λœλ‹€. 각각이 μ λ‹Ήν•œ ν•˜μœ„
κ΅¬μ‘°λΌ κ°€μ§€κ²Œ λœλ‹€. κ°€λ Ή CarEngine ν•˜μœ„ ꡬ쑰의 엔진듀, CarBody ꡬ쑰의 body 등등을 κ°€μ§€κ²Œ λœλ‹€.
(κ²°κ΅­, 각각이 CarEngine을 Base Class둜 ν•΄μ„œ 상속을 톡해 Ford Engine,Toyota Engineλ“±λ“±μœΌλ‘œ ν™•μž₯될 수 μžˆλ‹€λŠ” 말이닀.)
λ”°λΌμ„œ, μš°λ¦¬λŠ” λ‹€λ₯Έ μ§‘ν•©μ˜ 뢀뢄듀을 μ„ νƒν•˜μ§€ μ•Šκ³ , ν•˜λ‚˜μ˜ 집합(Family)μœΌλ‘œλΆ€ν„° 각각의 μžλ™μ°¨ 뢀뢄듀을 μ‰½κ²Œ 얻을 수
μžˆλŠ” 방법이 ν•„μš”ν•˜λ‹€. (Toyota μ—”μ§„μ—μ„œλŠ” Ford μžλ™μ°¨κ°€ μž‘λ™ν•  수 μ—†λ‹€.)
그리고 λͺ¨λ“  faimilyμ—μ„œ 같은 μ½”λ“œλΌ μ‚¬μš©ν•΄μ„œ 뢀뢄듀을(엔진,변속μž₯치..) μ–»λŠ” 것을 μ‚¬μš©ν•œλ‹€.
μš°λ¦¬λŠ” Abstract Factory Pattern을 μ΄μš©ν•΄μ„œ 두가지 λͺ©ν‘œλΌ 이룰 수 μžˆλ‹€.
(정리 : Abstract Factory Pattern은 Factory Pattern을 μΆ”μƒν™”μ‹œν‚¨ 것이닀.Factory Pattern의 λͺ©μ μ΄ Base Classλ‘œλΆ€ν„° 상속
된 μ—¬λŸ¬ μ’…λ₯˜μ˜ ν΄λž˜μŠ€λ“€ 쀑 ν•˜λ‚˜λΌ μ„ νƒν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 것을 의λΈν•œλ‹€.
Abstract Factory PatternλŠ” μ—¬λŸ¬ 개의 Factory쀑 ν•˜λ‚˜λΌ μ„ νƒν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 것을 μˆ˜ν–‰ν•œλ‹€. )
μš°λ¦¬λŠ” μ•„λž˜μ™€ 같은 μžλ™μ°¨μ™€ μžλ™μ°¨ λΆ€λΆ„λ“€μ˜ ν΄λž˜μŠ€λΌ κ°€μ§€κ³  μžˆλ‹€.


Vechileκ³Ό CarPartλŠ” Object 클래슀의 μ„œλΈŒ ν΄λž˜μŠ€μ΄λ‹€. λ¬Όλ‘ , 이 클래슀 κ΅¬μ‘°λŠ” λ§Žμ€ λ‹¨κ³„μ—μ„œ μ „μ²΄μ μœΌλ‘œ λ‹¨μˆœν™”λœλ‹€.
μžλ™μ°¨ νšŒμ‚¬λ“€(Ford)은 μžλ™μ°¨, λͺΈμ²΄, 엔진, 심지어 엔진 μ’…λ₯˜(가솔린 엔지 ν˜Ήμ€ λ””μ € 엔진)도 λͺ‡λͺ‡ λ‹€λ₯Έ λͺ¨λΈμ„ 가지고 μžˆλ‹€.
그러λ€λ‘œ μš°λ¦¬κ°€ μ—¬κΈ°μ„œ λ³΄μ—¬μ£ΌλŠ” 것 보닀 ν˜„μ‹€ μ„Έκ³„λŠ” μ€λ” 높은 좔상을 가지고 μžˆμ„ 것이닀. ν•˜μ§€λ§Œ, 우리의 νŒ¨ν„΄ λ¬˜μ‚¬λΌ
μ μš©ν•˜κΈ°μ—λŠ” μΆ©λΆ„ν•œ 수μ€μ˜ 좔상을 μ œκ³΅ν•˜κ³  μžˆλ‹€.

μš°λ¦¬λŠ” CarPartFactoryλΌλŠ” 좔상 νŒ©ν† λ¦¬ 클래슀 μ •μ˜λΌ ν•˜λ©΄μ„œ νŒ¨ν„΄ κ΅¬ν˜„μ„ μ‹œμž‘ν•œλ‹€. 이것은 "ꡬ체적인 ν΄λž˜μŠ€λ“€μ— λŒ€ν•œ
ꡬ체화 없이 κ΄€κ³„λœ ν˜Ήμ€ 의쑴적인 객체 집합을 λ§Œλ“€κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λΌ μ œκ³΅ν•˜λŠ”" (Intent λΆ€λΆ„μ—μ„œ μ–ΈκΈ‰ν•œ λ‚΄μš©)
ν΄λž˜μŠ€μ΄λ‹€. 그것은 좔상적인 μƒν’ˆ 생성 ν•¨μˆ˜λ“€(makeCar,makeEngine,makeBody)을 μ •μ˜ν•œλ‹€. κ·Έ λ•Œ μš°λ¦¬λŠ” μƒν’ˆ 집합 λ‹Ή
ν•˜λ‚˜μ˜ ꡬ체적인 νŒ©ν† λ¦¬ ν•˜μœ„ ν΄λž˜μŠ€λΌ μ •μ˜ν•œλ‹€. 각각의 ν•˜μœ„ ν΄λž˜μŠ€λ“€μ€ μ λ‹Ήν•œ 뢀뢄을 λ§Œλ“€κ³  λ°˜ν™˜ν•˜κΈ° μœ„ν•΄μ„œ μƒν’ˆ 생성
ν•¨μˆ˜λΌ μž¬ μ •μ˜ν•œλ‹€. κ·Έλž˜μ„œ μš°λ¦¬λŠ” ObjectλΌ μƒμ†ν•œ μƒˆλ‘œμš΄ ν•˜μœ„ κ΅¬μ‘°λΌ μΆ”κ°€ν•œλ‹€.



μžλ™μ°¨ λΆ€λΆ„(part) 생성 λ©”μ˜λ“œλΌ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ, μš°λ¦¬λŠ” 좔상 νŒ©ν† λ¦¬ 클래슀둜 μ‹œμž‘ν•œλ‹€.

      CarPartFactory>>makeCar
          self subclassResponsibility

      CarPartFactory>>makeEngine
          self subclassResponsibility

      CarPartFactory>>makeBody
          self subclassResponsibility
그리고 이 λ©”μ˜λ“œλΌ μ˜€λ²„λΌμ΄λ“œν•˜λŠ” ꡬ체적인 ν•˜μœ„ ν΄λž˜μŠ€λΌ μΆ”κ°€ν•œλ‹€.

      
      FordFactory>>makeCar
          ^FordCar new

      FordFactory>>makeEngine
          ^FordEngine new

      FordFactory>>makeBody
          ^FordBody new

      ToyotaFactory>>makeCar
          ^ToyotaCar new

      ToyotaFactory>>makeEngine
          ^ToyotaEngine new

      ToyotaFactory>>makeBody
          ^ToyotaBody new
μ „μ²΄μ μœΌλ‘œ, 우리의 νŒ©ν† λ¦¬λ“€μ€ μ•„λž˜μ™€ 같이 보인닀.


Abstract Factory둜, 뢀뢄듀을(part) κ²°ν•©μ‹œν‚€λŠ” 것은 νŒ©ν† λ¦¬μ˜ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•˜λŠ” 일이닀. νŒ©ν† λ¦¬λŠ” λΆ€λΆ„λ“€μ˜(part) ν•˜λ‚˜μ˜ μ§‘ν•©μ˜ (family)둜 λΆ€ν„° λ‚˜μ˜¨λ‹€λŠ” 것을 보μž₯ν•œλ‹€. ν•˜μ§€λ§Œ, νŒ©ν† λ¦¬λŠ” 단지 뢀뢄을(part) λ°˜ν™˜ν•˜λŠ” 일만 ν•  뿐이닀. μ΅œμ’… μƒν’ˆμ€ νŒ©ν† λ¦¬κ°€ μ‘°λ¦½ν•˜μ§€ μ•ŠλŠ”λ‹€. 그것은 ν΄λΌμ΄μ–ΈνŠΈμ˜ 일이닀. (μš°λ¦¬λŠ” Abstract Factory와 Builder νŒ¨ν„΄ μ‚¬μ΄μ˜ μ£Όμš”ν•œ 차이점을 λ‚˜μ€‘μ— λ³Ό 것이닀.)

CarAssembler 객체가 νŒ©ν† λ¦¬ ν΄λΌμ΄μ–ΈνŠΈλΌκ³  μΆ”μ •ν•΄λ³΄μž. 그리고 CarPartFactory κ°μ²΄λΌ μ°Έμ‘°ν•˜λŠ” νŒ©ν† λ¦¬λΌκ³  이름지어진 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λΌ κ°–μž.

    
         CarAssembler>>assembleCar
             | car |
             "Create the top-level part, the car object which starts out having no subcomponents, and add an engine, body, etc."
             
             car := factory makeCar
             car 
                 addEngine: factory makeEngine;
                 addBody: factory makeBody;
                 ...
             ^car
λ§Œμ•½, νŒ©ν† λ¦¬κ°€ FordFactory의 μΈμŠ€ν„΄μŠ€μ˜€λ‹€λ©΄, μžλ™μ°¨μ— μΆ”κ°€λ˜κΈ° μœ„ν•΄ 얻어진 엔진은 FordEngine일 것이닀. λ§Œμ•½ νŒ©ν† λ¦¬κ°€ ToyotaFactoryμ˜€λ‹€λ©΄, ToyotaEngine은 νŒ©ν† λ¦¬μ˜ makeEngine에 μ˜ν•΄μ„œ λ§Œλ“€μ–΄ 질 것이고, κ·Έ λ•Œ μžλ™μ°¨μ— 좔가될 것이닀.

아직, ν™•μ‹€ν•˜μ§€ μ•ŠλŠ” ν•œ 뢀뢄이 μžˆλ‹€. CarAssemblerλŠ”(factory ν΄λΌμ΄μ–ΈνŠΈ) μ–΄λ–»κ²Œ ꡬ체적인 CarPartFactory ν•˜μœ„ 클래슀의 μΈμŠ€ν„΄μŠ€λΌ μ–»μ„ 수 μžˆμ„κΉŒ? 그것은 νŠΉλ³„ν•œ ν•˜μœ„ 클래슀 μžμ²΄λΌ μ†ŒλΉ„μžμ˜ 선택에 κΈ°μ΄ˆν•΄μ„œ μΈμŠ€ν„΄μŠ€ν™” ν•  수 μžˆμ„ 것이닀. ν˜Ήμ€ μ™ΈλΆ€ 객체에 μ˜ν•΄μ„œ νŒ©ν† λ¦¬ μΈμŠ€ν„΄μŠ€λΌ λ‹€λ£°μˆ˜λ„ μžˆμ„ 것이닀.
ν•˜μ§€λ§Œ, 두 κ²½μš°μ— μžλ™μ°¨λΌ μƒμ„±ν•˜κΈ° μœ„ν•œ μ½”λ“œμ™€ κ·Έκ²ƒμ˜ μ»΄ν¬λ„ŒνŠΈ ν•˜μœ„ 뢀뢄은 μ—¬μ „νžˆ κ°™λ‹€. 즉, λͺ¨λ“  CarPartFactory ν΄λž˜μŠ€λ“€μ€ λ™μΌν•œ λ©”μ‹œμ§€ ν”„λ‘œν† μ½œμ„(λ‹€ν˜•μ„±)을 κ΅¬ν˜„ν•˜κΈ° λ•Œλ¬Έμ—, νŒ©ν† λ¦¬ ν΄λΌμ΄μ–ΈνŠΈλŠ” νŒ©ν† λ¦¬ νƒ€μž…μ΄ 무엇인지 μƒκ΄€ν•˜μ§€ μ•Šκ³  ν˜ΈμΆœμ„ ν•  수 μžˆλ‹€. 그것은 단지 νŒ©ν† λ¦¬ ν”„λ‘œν† μ½œμ— μ˜ν•΄ μ œκ³΅λ˜λŠ” 일반적인 λ©”μ‹œμ§€λΌ μ „μ†‘ν•œλ‹€.

λ‹€ν˜•μ„±μ˜ 힘 λ•Œλ¬Έμ—, ν΄λΌμ΄μ–ΈνŠΈλŠ” μ½”λ“œ κ΅¬ν˜„μ„ ν•œλ²ˆλ§Œ ν•˜λ©΄λœλ‹€. ABSTRACT FACTORY PATTERN을 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 경우, μžλ™μ°¨ 생성 μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 보일 것이닀.(μ•„μ£Ό λΉ„νš¨μœ¨μ μΈ μ½”λ“œ)

         CarAssembler>>assembleCar
            "Without Abstract Factory."
            | car |
            car := (consumerChoice == #Ford
                       ifTrue:  [FordCar new]
                       ifFalse:  [consumerChoice == #Toyota
                           ifTrue:  [ToyotaCar new]
                           ifFalse:  [consumerChoice == #Porsche
                                  ifTrue:  [PorscheCar new]
                                  ifFalse:  [...])
            car addEngine:
                   (consumerChoice == #Ford
                       ifTrue:  [FordEngine new]
                       ifFalse:  [...]).
           
            ...
            ^car
λ”°λΌμ„œ, CarAssmeblerλΌ λ§Œλ“€κΈ° μœ„ν•œ μžλ™μ°¨ μ’…λ₯˜κ°€ 무엇이고 κ·Έ ν•˜μœ„ 뢀뢄듀이 무엇을 ν•΄μ•Όν•˜κ³ , κ·Έκ²ƒμ˜ μ‹€μ œ λΆ€λΆ„μ˜ μΈμŠ€ν„΄μŠ€κ°€ 무엇을 μˆ˜ν–‰ν•΄μ•Ό ν• μ§€λΌ κ²°μ •ν•œλ‹€. ABSTRACT FACTORY 해결은 μš°λ¦¬κ°€ CarAssembler 객체 λ°–μ˜ λͺ¨λ“  행동듀을 μΆ”μƒν™”μ‹œν‚¨λ‹€. 그리고 νŒ©ν† λ¦¬λ‘œ λΆ„λ¦¬ν•œλ‹€. νŠΉλ³„ν•œ μžλ™μ°¨ νŒ©ν† λ¦¬λ‘œ CarAssembler 확인을 ν•œ 후에, CarAssemblerλŠ” κ°„λ‹¨ν•˜κ²Œ ꡬ체적인 μžλ™μ°¨μ™€ ν•˜μœ„ 뢀뢄을 λ§Œλ“€κΈ° μœ„ν•œ νŒ©ν† λ¦¬λΌ ν˜ΈμΆœν•œλ‹€.

ABSTRACT FACTORY 접근은 μ€λ” λͺ¨λ“ˆμ μ΄κ³ , μ€λ” μ‰½κ²Œ ν™•μž₯ κ°€λŠ₯ν•œ λ””μžμΈμ„ ν•  수 μžˆλ‹€. μ‹œμŠ€ν…œμ— μƒˆλ‘œμš΄ νƒ€μž…μ˜ μžλ™μ°¨λΌ μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œ, μš°λ¦¬λŠ” CarPartFactory의 μ„œλΈŒ 클래슀λΌ
μΆ”κ°€ν•˜κ³  그것을 μΈμŠ€ν„΄μŠ€ν™”κΈ° μœ„ν•œ μ½”λ“œκ°€ ν•„μš”ν•  뿐이닀.

여기에 효과적인 두 개의 좔상이 μžˆλ‹€. 첫번째, λͺ¨λ“  CarPartFactory듀이 같은 λ©”μ‹œμ§€ μΈν„°νŽ˜μ΄μŠ€λΌ κ΅¬ν˜„ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ 그듀이 λ©”μ‹œμ§€λΌ λ³΄λ‚΄κΈ° μœ„ν•΄μ„œ CarPartFactory의 μ •ν™•ν•œ
νƒ€μž…μ΄ 무엇인지 신경쓰지 μ•Šκ³  같은 생성 λ©”μ‹œμ§€λΌ λ³΄λ‚΄λŠ” 것을 νŒ©ν† λ¦¬κ°€ μˆ˜ν–‰ν•œλ‹€.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:04
Processing time 0.0445 sec