Skip to content

Latest commit

ย 

History

History
283 lines (199 loc) ยท 7.53 KB

3_Factory Method_Swift.md

File metadata and controls

283 lines (199 loc) ยท 7.53 KB

Factory Pattern

๐Ÿ“Œ **ํŒฉํ† ๋ฆฌ ํŒจํ„ด**

๊ฐ์ฒด ์ƒ์„ฑ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ƒ์„ฑ๊ณผ์ •์€ ๊ทธ ์•ˆ์— ๊ตฌํ˜„ํ•˜๋Š” ํŒจํ„ด

โ†’ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ํŒฉํ† ๋ฆฌ๋กœ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„์ด ์•„๋‹Œ ์ถ”์ƒ์ ์ธ ๋ถ€๋ถ„์— ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค.


์‚ฌ์šฉ ๋ชฉ์ 

  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์บก์Šํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ
  • ๊ฐ์ฒด ์ƒ์„ฑ์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ genericํ•œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ถ„๋ฆฌ

โ†’ ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ผ์–ด์žˆ์„ ๋•Œ, ์ด ๋กœ์ง์„ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค

โ†’ ๋‹คํ˜•์„ฑ์œผ๋กœ ์ธํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ๋ฅผ ์–ธ์ œ๋“ ์ง€ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค

์ฆ‰, ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.


Factory Method Pattern

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๊ฒฐ์ •ํ•˜๋Š” ํŒจํ„ด์œผ๋กœ ๋‹ค์‹œ ๋งํ•ด, ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ผ์„ย ์„œ๋ธŒํด๋ž˜์Šค์—๊ฒŒ ๋งก๊ธด๋‹ค.

image image

โ†’ ๊ฐ๊ฐ์˜ ๊ณต์žฅ์ด ๋‹จ์ผ ์ œํ’ˆ์„ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ


image
// ๊ณต์žฅ: ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
protocol TrumpFactory {
		func makeTrump(with: ๋ฌธ์–‘) -> Trump
}
class PatternTrumpFactory: TrumpFactory {         // TrumpFacotry ์ฑ„ํƒ
		func makeTrump(with: ๋ฌธ์–‘) -> Trump {
				switch(๋ฌธ์–‘) {
				case heart: return HeartCard()
				case diamond: return DiamondCard()
				case clover: return CloverCard()
				case spade: return SpadeCard()
				}
		}
}
protocol Trump { 
   var name: String
}
// Trump ํ”„๋กœํ† ์ฝœ ์ฑ„ํƒ

class HeartCard: Trump {...}
class DiamondCard: Trump {...}
class CloverCard: Trump {...}
class SpadeCard: Trump {...}
let patternTrumpFactory = PatternTrumpFactory()
let anyTrump = patternTrumpFactory.makeTrump(with: ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋ฌธ์–‘)


๊ตฌ์กฐ

image image image

Abstract Creator: ํŒฉํ† ๋ฆฌ์— ๋Œ€ํ•œ ํ”„๋กœํ† ์ฝœ ์ œ๊ณต

Concrete Creator: ์‹ค์ œ ํŒฉํ† ๋ฆฌ ์—ญํ• 

Concrete Product: ํŒฉํ† ๋ฆฌ์—์„œ ๋งŒ๋“ค์–ด์ง„ ์ œํ’ˆ๋“ค

Abstract Product: ์ œํ’ˆ๋“ค์ด ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ

โ†’ ์„ ์–ธ๋ถ€์™€ ๊ตฌํ˜„๋ถ€ ๋ถ„๋ฆฌ




์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ์ „์—ญ์ ์ธ ์ ‘๊ทผ์„ ๋ณด์žฅ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ์ธ static ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

let patternTrumpFactory = PatternTrumpFactory.shared
let anyTrump = patternTrumpFactory.makeTrump(with: ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋ฌธ์–‘)

class PatternTrumpFactory: TrumpFactory {         // TrumpFacotry ์ฑ„ํƒ
		
		static let shared = PatternTrumpFactory()     // ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด ์ƒ์„ฑ
		private init() {}                             // initํ•จ์ˆ˜ ์ ‘๊ทผ ์ œํ•œ์ž private
		
		func makeTrump(with: ๋ฌธ์–‘) -> Trump {           // makeTrump ์˜ค๋ฒ„๋ผ์ด๋”ฉ
				switch(๋ฌธ์–‘) {
						case heart: return HeartCard()
						case diamond: return DiamondCard()
						case clover: return CloverCard()
						case spade: return SpadeCard()
				}
		}
}

์นด๋“œ์˜ ์ข…๋ฅ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋Š˜์–ด๋‚œ๋‹ค๋ฉด?

Trump ํ”„๋กœํ† ์ฝœ์˜ ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค ์ƒ์„ฑ + makeTrump()์˜ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋งŒ์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ

โ†’ SOLID์›์น™ ์ค‘ ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ์–ด์•ผํ•˜๋‚˜ ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)๋ฅผ ๋งŒ์กฑํ•œ๋‹ค.



ํŠธ๋Ÿผํ”„์นด๋“œ๊ฐ€ ์•Œ๋งž์€ ๋„๊ตฌ๋ฅผ ๋“ค๊ณ  ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด?

let patternTrumpFactory = PatternTrumpFactory.shared
let patternSwordFactory = PatternSwordFactory.shared
let patternPaintFacotry = PatternPaintFactory.shared

let anyTrump = patternTrumpFactory.makeTrump(with: ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋ฌธ์–‘)
let anySword = patternSwordFactory.makeSword(with: ์•Œ๋งž์€ ๋ฌธ์–‘)
let anyPaint = patternPaintFactory.makePaint(with: ์•Œ๋งž์€ ๋ฌธ์–‘)
class PatternSwordFactory: SwordFactory {         // TrumpFacotry ์ฑ„ํƒ
		
		static let shared = PatternSwordFactory()     // ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด ์ƒ์„ฑ
		private init() {}                             // initํ•จ์ˆ˜ ์ ‘๊ทผ ์ œํ•œ์ž private
		
		func makeSword(with: ๋ฌธ์–‘) -> Sword {           // makeTrump ์˜ค๋ฒ„๋ผ์ด๋”ฉ
				switch(๋ฌธ์–‘) {
						case heart: return HeartSword()
						case diamond: return DiamondSword()
						case clover: return CloverSword()
						case spade: return SpadeSword()
				}
		}
}

protocol SwordFactory {
		func makeSword(with: ๋ฌธ์–‘) -> Sword
}

protocol Sword {}

class HeartSword: Sword {...}

// ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Paint์™€ ๊ด€๋ จํ•ด์„œ๋„ protocol๊ณผ class๊ฐ€ ํ•„์š”ํ•จ


Abstract Factory Pattern

๊ด€๋ จ๋œ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ

image

๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ผ๋ฆฌ ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ํŒฉํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฑธ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค!

protocol AbstractTrumpWithStuffFactory {
		func makeTrump() -> Trump
		func makeSword() -> Sword
		func makePaint() -> Paint
}
class HeartFactory: AbstractTrumpWithStuffFactory {
		func makeTrump() -> Trump {
				return HeartTrump()
		}

		func makeSword() -> Sword {
				return HeartSword()
		}

		func makePaint() -> Paint {
				return HeartPaint()
		}
}

class DiaFactory: AbstractTrumpWithStuffFactory {
		func makeTrump() -> Trump {
				return DiaTrump()
		}

		func makeSword() -> Sword {
				return DiaSword()
		}

		func makePaint() -> Paint {
				return DiaPaint()
		}
}
class TrumpWithStuffFactory {
		static let factory: AbstractTrumpWithStuffFactory {
				// if ๋ฌธ์–‘ == ํ•˜ํŠธ {
						
				}
				// ์นด๋“œ ๋ฌด๋Šฌ๋ณ„ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ
				// return HeartFactory, return DiaFactory ...
		}
}
let trumpFactory = TrumpWithStuffFactory.factory
		
let trump = trumpFactory.trump
let sword = trumpFactory.sword
let paint = trumpFactory.paint


์ถ”์ƒ ํŒฉํ† ๋ฆฌ vs ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ

<์ถ”์ƒ ๋ฉ”์†Œ๋“œ ํŒจํ„ด>: ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

ํŠธ๋Ÿผํ”„์™€ ๋ฌผ๊ฑด ํŒฉํ† ๋ฆฌ โ†’ ํ•˜ํŠธ ํŠธ๋Ÿผํ”„์™€ ๋ฌผ๊ฑด โ†’ ํ•˜ํŠธ ํŠธ๋Ÿผํ”„, ํ•˜ํŠธ ๊ฒ€, ํ•˜ํŠธ ๋ฌผ๊ฐ


<ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด>

ํŠธ๋Ÿผํ”„ ํŒฉํ† ๋ฆฌ โ†’ ํŠธ๋Ÿผํ”„

๊ฒ€ ํŒฉํ† ๋ฆฌ โ†’ ๊ฒ€

๋ฌผ๊ฐ ํŒฉํ† ๋ฆฌ โ†’ ๋ฌผ๊ฐ