๊ฐ์ฒด ์์ฑ์ ํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ , ์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ตฌ์ฒด์ ์ธ ์์ฑ๊ณผ์ ์ ๊ทธ ์์ ๊ตฌํํ๋ ํจํด
โ ๊ฐ์ฒด์ ์์ฑ์ ํฉํ ๋ฆฌ๋ก ๋ชจ๋ํํ์ฌ ๊ฐ์ฒด ์์ฑ ์ ๊ตฌ์ฒด์ ์ธ ๋ถ๋ถ์ด ์๋ ์ถ์์ ์ธ ๋ถ๋ถ์ ์์กดํ ์ ์๋ค.
์ฌ์ฉ ๋ชฉ์
- ๊ฐ์ฒด์ ์์ฑ์ ์บก์ํํ๊ธฐ ์ํด์
- ๊ฐ์ฒด ์์ฑ์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ genericํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋ถ๋ฆฌ
โ ์ธ์คํด์ค์ ์์ฑ์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ผ์ด์์ ๋, ์ด ๋ก์ง์ ์์กด์ฑ์ ๊ฐ์ง๋ ๊ฐ์ฒด๋ก๋ถํฐ ๋ถ๋ฆฌํ ์ ์๋ค
โ ๋คํ์ฑ์ผ๋ก ์ธํด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ๋ฅผ ์ธ์ ๋ ์ง ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค
์ฆ, ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ณผ์ ์ด ๋ณ๊ฒฝ๋์ด๋ ์์กด์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ ์์ ๋์ง ์๊ณ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์๋๋ฆฌ์ค๋ง ์์ ํ๋ฉด ๋๋ค.
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ๊ณผ์ ์์ ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์๋ธํด๋์ค์์ ๊ฒฐ์ ํ๋ ํจํด์ผ๋ก ๋ค์ ๋งํด, ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์ผ์ย ์๋ธํด๋์ค์๊ฒ ๋งก๊ธด๋ค.
// ๊ณต์ฅ: ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค
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: ๋ง๋ค๊ณ ์ถ์ ๋ฌธ์)
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๊ฐ ํ์ํจ
๊ด๋ จ๋ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑ
๊ฐ์ ํน์ฑ์ ๊ฐ์ง๋ ๊ฐ์ฒด๋ผ๋ฆฌ ์์ฐํ ์ ์๋ ํฉํ ๋ฆฌ์ ๋ํ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฑธ ์ถ์ ํฉํ ๋ฆฌ๋ผ๊ณ ํ๋ค!
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
<์ถ์ ๋ฉ์๋ ํจํด>: ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฑ
ํธ๋ผํ์ ๋ฌผ๊ฑด ํฉํ ๋ฆฌ โ ํํธ ํธ๋ผํ์ ๋ฌผ๊ฑด โ ํํธ ํธ๋ผํ, ํํธ ๊ฒ, ํํธ ๋ฌผ๊ฐ
<ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด>
ํธ๋ผํ ํฉํ ๋ฆฌ โ ํธ๋ผํ
๊ฒ ํฉํ ๋ฆฌ โ ๊ฒ
๋ฌผ๊ฐ ํฉํ ๋ฆฌ โ ๋ฌผ๊ฐ