μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- κΈ°μ΄λ¬Έλ²
- κ³ λμ kit
- νλ‘κ·Έλλ¨Έμ€
- BFS
- concurrency
- GroupBy
- IOS
- SOPT
- algoritm
- SwiftUI Tutorials
- μ΄μ§νμ
- λμ κ³νλ²
- 0μ΄λμ΄μλκΈΈ
- SQL
- SwiftUI νν 리μΌ
- μ°μνμ€λΆλΆμμ΄μν©
- DynamicProgramming
- APPJAM
- λ€μ΄λλ―Ήνλ‘κ·Έλλ°
- URLSession
- dfs
- SwiftUI
- Til
- duno
- HAVIT
- binarySearch
- GCD
- Swift
- discardableResult
- algorithm
- Today
- Total
suvera-dev π₯¦
Design Pattern) μμ±ν¨ν΄ #1 - ν©ν 리 ν¨ν΄ λ³Έλ¬Έ
λμμΈν¨ν΄ μ€ μμ±ν¨ν΄μ΄λ
κ°μ²΄μ μμ±κ³Όμ μ μ°Έμ¬νλ κ².
κ°μ²΄κ° μΈμ€ν΄μ€ν λλ κ³Όμ μ μΆμνν©λλ€.
κ°μ²΄κ° ꡬμ±, μμ±λκ³ ννλλ λ°©μμ κ΄κ³μμ΄
μμ€ν μ λ 립μ μΌλ‘ λ§λλλ° λμμ΄ λ©λλ€ !
λ²μλ‘ λΆλ₯ν΄λ³΄μλ©΄, ν¨ν΄μ μ£Όλ‘ ν΄λμ€μ μ μ©νλμ§
κ°μ²΄μ μ μ©νλμ§ κ΅¬λΆν΄λ³Ό μ μλ€.
ν΄λμ€ : κ°μ²΄λ₯Ό μμ±νλ μ± μμ μΌλΆλ₯Ό μλΈ ν΄λμ€κ° λ΄λΉνλλ‘ λκΈ°λ κ²
=> ν©ν 리 λ©μλ ν¨ν΄
κ°μ²΄ : κ°μ²΄λ₯Ό μμ±νλ μ± μμ μΌλΆλ₯Ό λ€λ₯Έ κ°μ²΄μκ² μμνλ κ²
=> μΆμ ν©ν 리, λΉλ, νλ‘ν νμ , μ±κΈν€
μ€λμ μ΄ μ€μμ ν©ν 리 λ©μλ ν¨ν΄κ³Ό μΆμ ν©ν 리 ν¨ν΄μ λν΄
λ€λ€λ³΄κ² μ΅λλ€ !
π ν©ν 리 ν¨ν΄μ΄λ ?
κ°μ²΄ μμ±μ μ λ΄νλ struct/classλ₯Ό λ§λ€μ΄ ꡬ체μ μΈ μμ±κ³Όμ μ κ·Έ μμ ꡬννλ ν¨ν΄
μ μ¬μ©ν κΉ ?
1) κ°μ²΄μ μμ±μ κ²μΌλ‘ λλ¬λμ§ μλλ‘ μΊ‘μνν΄μ μ¬μ©νκΈ° μν΄μ !
2) κ°μ²΄ μμ±μ ꡬ체μ μΈ κ΅¬νμ genericνκ² κ°μ²΄λ₯Ό μ¬μ©ν΄ λΆλ¦¬νκΈ° μν΄μ !
ν©ν 리μ κ΄λ ¨λ ν¨ν΄μ μμ λ§νλ―μ΄
2κ°μ§κ° μμ΅λλ€ !
ν©ν 리 λ©μλ ν¨ν΄κ³Ό μΆμ ν©ν 리 ν¨ν΄ !
λ¬΄κ° λ€λ₯Έκ±΄μ§ 보μμ£ .
ππ ν©ν 리 λ©μλ ν¨ν΄ : λ¨μΌ μν μμ° λ΄λΉ
(κ°μ²΄ μμ± μ²λ¦¬λ₯Ό μλΈ ν΄λμ€λ‘ λΆλ¦¬ ν΄ μ²λ¦¬νλλ‘ μΊ‘μννλ ν¨ν΄)
ν©ν 리 λ©μλ ν¨ν΄(Factory Method Pattern)μ κ°μ²΄λ₯Ό μμ±νκΈ° μν΄ μΈν°νμ΄μ€λ₯Ό λ§λλλ€.
μ΄λ€ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€μ§λ₯Ό μλΈν΄λμ€μμ κ²°μ νλλ‘ ν©λλ€.
ν©ν 리 λ©μλλ₯Ό μ΄μ©νλ©΄ μΈμ€ν΄μ€λ₯Ό λ§λλ μΌμ μλΈν΄λμ€λ‘ λ―Έλ£° μ μμ΅λλ€.
ππ μΆμ ν©ν 리 ν¨ν΄ : μλ‘ κ΄λ ¨μλ μνλ€μ μ λΆ λ¬Άμ΄μ κ°μ μ’ λ₯μ μνμ μμ°μ λ΄λΉ
(νΉμ κ·Έλ£Ήμ μνλ μ¬λ¬ κ°μ²΄λ€μ νλμ ν©ν λ¦¬λ‘ λ¬Άμ΄μ μμ±ν μ μλ ν¨ν΄ )
μΆμν©ν 리 ν¨ν΄μ ꡬμ ν΄λμ€μ μμ‘΄νμ§ μκ³ λ μλ‘ μ°κ΄λκ±°λ μμ‘΄μ μΈ κ°μ²΄λ‘
μ΄λ£¨μ΄μ§ μ νκ΅°μ μμ°νλ μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€. ꡬμ ν΄λμ€λ μλΈν΄λμ€μμ λ§λλλ€.
1. ν©ν 리 λ©μλ ν¨ν΄ : λ¨μΌ μν μμ° λ΄λΉ
μλ₯Ό λ€μ΄ μ μ₯ νλ²μ λ§λλ 곡μ₯μ΄ μλ€κ³ κ°μ ν΄λ³΄κ² μ΅λλ€.
μ μ₯ μΈνΈμλ μμΌ μ μΈ λ°μ§κ° μλ€κ³ μκ°νκ³ , μμ μ’ λ₯λ
λΈλ λ€μ΄λΉ κ·Έλ μ΄κ° μλ€κ³ μκ°ν΄λ³Όκ²μ !
κ·Έλ¬λ©΄ ν©ν 리 λ©μλμμλ κ°κ° μ νλ³λ‘ λ¨μΌ μ νμ λ§λλλ€.
μμΌ κ³΅μ₯ / μ μΈ κ³΅μ₯ / λ°μ§ 곡μ₯ μΌλ‘ λλμ΄μ
makeJacket(with: μμ)
makeShirt(with: μμ)
makePants(with: μμ)
κ°κ°μ λ©μλμμ λ¨μΌ μ ν
μ¦, μμΌ κ³΅μ₯μμλ λΈλμμΌ, λ€μ΄λΉμμΌ, κ·Έλ μ΄μμΌμ λ§λλλ€.
protocol JacketFactory {
func makeJacket(with: color) -> Jacket
}
class ColoredJacketFactory: JacketFactory {
static let shared = ColoredJacketFactory()
private init() { }
func makeJacket(with: color) {
switch color {
case black: return BlackJacket()
case navy: return NavyJacket()
case gray: return GrayJacket()
}
}
}
class viewController: UIViewController {
let jacketFactory = ColoredJacketFactory.shared()
let jacket = JacketFactory.makeJacket(with: "μνλ μμ")
}
μ½λλ‘ μ μ΄λ³΄λ©΄ μ΄λ°μμΌλ‘ ννλ μ μλλ°, μ¬κΈ°μ
μμΌ ν©ν 리λΌλ νλ‘ν μ½μ ColoredμμΌν©ν 리 ν΄λμ€κ° μ±νμν΄μ ꡬνμ ν΄μ€λλ€.
μμμ λ§κ² κ°κ°μ μμΌμ μμ°νκ² μ£
μ¬κΈ°μ ν©ν 리 λ©μλμμ κ° μν λ³λ‘ μ§μΉνλ μ©μ΄λ‘ λ°κΏλ³΄λ©΄,
ν©ν 리μ λν νλ‘ν μ½μ μ 곡νλ μμΌν©ν 리λ Abstract Creator λΌκ³ ν©λλ€.
ν΄λΉ νλ‘ν μ½μ μ±νν΄ μ€μ ν©ν 리 μν μ νλ 컬λ¬λμμΌν©ν 리λ Concrete Creator λΌκ³ νκ³ ,
ν΄λΉ ν©ν 리μμ μμ°λ μ νλ€μΈ λΈλ/λ€μ΄λΉ/κ·Έλ μ΄ μμΌλ€μ Concrete Product,
κ·Έλ¦¬κ³ ν΄λΉ μ νλ€μ΄ μ±ννκ³ μλ νλ‘ν μ½μ΄ μμΌ νλ‘ν μ½μ Abstract ProductλΌκ³ ν©λλ€.
ν©ν 리 λ©μλλ κ³μ λ§νλ€μνΌ λ¨μΌ μνμ μμ°νλ€λ³΄λ, κ° μ νμ μμ°μ λν μ± μλ§ μ‘΄μ¬ν©λλ€.
νμ§λ§ μ°λ¦¬λ μμΌλΏλ§μλλΌ μ μΈ μ λ°μ§λ λ§λ€μ΄μ μ μ₯μΈνΈλ₯Ό μμ±ν΄μΌ λλ μν©μ λλ€.
κ·Έλ κ² λλ κ²½μ°μ μμΌ μ μΈ λ°μ§ λͺ¨λμ λν΄μ κ°κ° ν©ν 리 λ©μλλ₯Ό λ§λ€μ΄μΌλ©λλ€.
μ¬κΈ°μ ν©ν 리 λ©μλμ λ¬Έμ μ μ νμ ν μ μμ΅λλ€.
class viewController: UIViewController {
let jacketFactory = ColoredJacketFactory.shared()
let shirtFactory = ColoredShirtFactory.shared()
let pantsFactory = ColoredPantsFactory.shared()
let jacket = JacketFactory.makeJacket(with: "μνλ μμ")
let shirt = ShirtFactory.makeShirt(with: "μνλ μμ")
let pants = PantsFactory.makePants(with: "μνλ μμ")
}
μ΄λ°μμΌλ‘ μΆκ°λλ©΄ κ³μ μΆκ° ν©ν 리 μΈμ€ν΄μ€κ° λμ΄λκ² λ©λλ€.
λͺ¨λ μ νλ€μ΄ λμΌν μμμΌλ‘ μ μλμ΄μΌνλλ°
μ§κΈ κ° μ νλ³λ‘ μμ°μ΄ λΆλ¦¬λμ΄ μμ΄μ
μΆνμ μ μ₯μΈνΈμ μ λ°μ΄λΌλ μΆκ° ꡬμ±νμ΄ λμ΄λκ² λμ΄
ν©ν λ¦¬κ° μΆκ°λμμ κ²½μ°μ λ°λμ κ°μ μμ μ νλΌλ¦¬ λ§λ€μ΄ λΈλ€λ 보μ₯μ΄ μμ£ !
κ·Έλμ μ΄ μν©μμλ λ°λμ κ°μ μμ μ νλΌλ¦¬ μμ°νκΈ° μν΄
μμλ³λ‘ ν©ν 리λ₯Ό λκ² λ©λλ€ !
- λΈλμ μ₯ ν©ν 리
- λ€μ΄λΉμ μ₯ ν©ν 리
- κ·Έλ μ΄μ μ₯ ν©ν 리
μ΄κ² μΆμν©ν 리 ν¨ν΄μ΄λΌκ³ μκ°νλ©΄λ©λλ€ .
2. μΆμ ν©ν 리 ν¨ν΄ : μλ‘ κ΄λ ¨μλ μνλ€μ μ λΆ λ¬Άμ΄μ κ°μ μ’ λ₯μ μνμ μμ°μ λ΄λΉ
μ μ₯ ν©ν 리μμ κ°μ μμμ μμΌ μ μΈ λ°μ§λ₯Ό μμ°ν μ μλλ‘ λ©μλλ₯Ό μ μνλ©΄ λ©λλ€.
protocol SetAbstractFactory {
func makeJacket() -> Jacket
func makeShirt() -> Shirt
func makePants() -> Pants
}
class BlackSetAbstractFactory: SetAbstractFactory {
func makeJacket() -> Jacket {
return BlackJacket()
}
func makeShirt() -> Shirt {
return BlackShirt()
}
func makePants() -> Pants {
return BlackPants()
}
}
μΆμν©ν 리μ ꡬ쑰λ ν©ν 리 λ©μλμ λ€λ₯΄κ², μμλ³λ‘ ν©ν 리λ₯Ό μ μν νμ
κ° μμλ³ μ νλ§ μμ°λλλ‘ λ°λ‘ ν©ν 리λ₯Ό μ μν©λλ€.
μ μ₯μΈνΈμΆμν©ν 리λ₯Ό μ±νν λΈλμ μ₯ν©ν 리μμ
λΈλ μμΌ/ μ μΈ / λ°μ§λ₯Ό μμ°ν΄λ λλ€.
ꡬ쑰λλ‘ λ³΄λ©΄ μ μ₯ν©ν λ¦¬κ° μΆμν©ν 리μ΄κ³
μ΄λ₯Ό μ±νν λΈλμ μ₯ν©ν 리, λ€μ΄λΉμ μ₯ν©ν 리, κ·Έλ μ΄μ μ₯ν©ν 리
κ·Έλ¦¬κ³ κ±°κΈ°μ λ§λ€μ΄λΈ λΈλμμΌ, λΈλμ μΈ , λΈλλ°μ§λ AbstractProductμΈ
μμΌ, μ μΈ , λ°μ§ νλ‘ν μ½μ κ°κ° μ±ννκ³ μμ
μΆμν©ν 리λ ν©ν 리 λ©μλμ μμνΈνμ΄ μλλ©°
κ° ν¨ν΄λ³λ‘ μ₯λ¨μ μ΄ μ‘΄μ¬ν©λλ€.
κ΄λ ¨λ κ°μ²΄λ₯Ό μ¬λ¬κ° μμ°ν μ μλ μΆμν©ν 리λ
κ° μ΄μ체μ λ³λ‘ κ·Έλ €μΌνλ λ·°μ μ’ λ₯λ λμΌνλ μΈλΆμ μΈ κ΅¬νμ΄ λ€λ₯Όκ²½μ°
ViewAbstractFactoryλ₯Ό νμ©ν΄μ κ° μ΄μ체μ λ³λ‘ μνλ λ·°λ₯Ό 그리λ κ²½μ°κ° κ°λ₯ν©λλ€ !
protocol ViewAbstractFactory {
public func createButton() -> Button
public func createLabel() -> Label
}
protocol Button {
func click()
}
protocol Label {
var text: String
}
class LinuxViewFactory: ViewAbstractFactory {
func createButton() -> Button {
return LinuxButton()
}
func createLabel() -> Label {
return LinuxLabel(text: "Linux Label")
}
}
class LinuxButton: Button {
func click() {
print("Linux Button Click")
}
}
class LinuxLabel: Label {
var text: String init(text: String) {
self.text = text
}
}
let factory = LinuxViewFactory()
let button = factory.createButton()
let label = factory.createLabel()
μμ μμμ²λΌ μ¬μ©ν΄μ£Όλ©΄ λκ³ !
κ° UI μμλ€μ΄ μ λΆ μ°κ΄μ΄ μλ κ²½μ° μ¬μ©νκΈ°μ μ ν©νλ€κ³ ν©λλ€ !
λ¨μΌν μ νμ μμ°ν μ μλ ν©ν 리 λ©μλλ
μλμ²λΌ νλ‘μ νΈμμ μ¬μ©νλ 뷰컨μ΄λ μ½λλ€μ΄ν°λ₯Ό κ° ν΄λμ€μμ μμ°νλ κ²μ΄ μλλΌ
κ°κ° ν©ν 리 λ©μλλ₯Ό λ§λ€μ΄μ λ 립μ μΌλ‘ μμ° μ± μμ 맑기λ ννκ° κ°λ₯ν©λλ€.
protocol RouterProtocol {
}
protocol AuthCoordinator {
}
protocol CoordinatorFactoryProtocol {
func makeAuthCoordinatorBox(router: RouterProtocol, coordinatorFactory: CoordinatorFactoryProtocol, viewControllerFactory: ViewControllerFactory) -> AuthCoordinator
}
final class CoordinatorFactory: CoordinatorFactoryProtocol {
func makeAuthCoordinatorBox(router: RouterProtocol, coordinatorFactory: CoordinatorFactoryProtocol, viewControllerFactory: ViewControllerFactory) -> AuthCoordinator {
let coordinator = AuthCoordinator(router: router, coordinatorFactory: coordinatorFactory, viewControllerFactory: viewControllerFactory)
return coordinator
}
}
protocol AViewController {
}
class ViewControllerFactory {
func instantiateAViewController() -> AViewController {
}
}
'iOS > Design Pattern' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Design Pattern) ꡬ쑰ν¨ν΄ #1 - Bridge Pattern (2) | 2022.05.12 |
---|---|
Design Pattern ) λμμΈν¨ν΄ κ°μ 2νΈ (0) | 2022.05.05 |
Design Pattern ) λμμΈ ν¨ν΄ κ°μ (4) | 2022.04.13 |