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.0282 sec