์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- Lv2
- SnapKit
- arkit
- visionOS
- ios
- reactorkit
- swift
- BOJ
- realm
- ํจ์คํธ์บ ํผ์ค
- TCA
- CollectionView
- Kuring
- UIKit
- Xcode
- node.js
- combine
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐฑ์ค
- XCTest
- tableView
- MVVM
- rxcocoa
- designpattern
- raywenderlich
- SwiftUI
- RxSwift
- BFS
- Swfit
- Flutter
- Today
- Total
lgvv98
[Swift] FlyWeight Pattern ๋ณธ๋ฌธ
FlyWeight Pattern
โ FlyWeight Pattern
์๋์ ๋ฌธ์๋ฅผ ๊ตฌ์ ํ์ฌ ์์ด ๋ฌธ์๋ฅผ ๋ฒ์ญํ๊ณ ์ดํดํ ๊ฒ์ ๋ฐํ์ผ๋ก ๊ธ์ ์์ฑํ๊ณ ์์ต๋๋ค.
https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/18-flyweight-pattern
FlyWeight ํจํด์ ๋ฉ๋ชจ๋ฆฌ์ฌ์ฉ๋๊ณผ ์ฒ๋ฆฌ๋ฅผ ์ต์ํํ๋ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์ ๋๋ค.
Flyweight ํจํด์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ฒ ๋๋ค. ํ์ง๋ง, ๋ฐ์ดํฐ ๊ณต์ ๋ฅผ ํ๊ธฐ์ immutable(๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅ)ํฉ๋๋ค.
ํ๋ผ์ด์จ์ดํธ ํจํด์๋ flyweights๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ์ฒด์ ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๋ฐํํ๋ ์ ์ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
์ด ๋ง์ด ์ต์ํ๊ฒ ๋ค๋ฆฌ์๋์? ๋น์ฐํ ๊ทธ๋์ผ ํฉ๋๋ค!! ํ๋ผ์ด์จ์ดํธ ํจํด์ ์ฑ๊ธํค ํจํด์ ๋ณํ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ๋ผ์ด์จ์ดํธ ํจํด์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋์ผํ ํด๋์ค์ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด์ ๋ณผ ์์ ๋ก, ํ ๊ฐ์ง ์๊ฐ ์์ ์ฌ์ฉ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ง๊ธ ๋นจ๊ฐ์, ๋ น์ ๋ฑ์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ ์์์ ๋์ผํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋จ์ผ ์ธ์คํด์ค์ ๋๋ค.
When should you use it?
์ฑ๊ธํค์ ์ฌ์ฉํ ์ฅ์์๋ ํ๋ผ์ด์จ์ดํธ๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ตฌ์ฑ์ด ๋ค๋ฅธ ์ฌ๋ฌ ๊ณต์ ์ธ์คํด์ค๊ฐ ํ์ํฉ๋๋ค. ์์ฑํด์ผ ํ๋ ๋ฆฌ์์ค๊ฐ ๋ง์ ๊ฐ์ฒด๊ฐ ์๊ณ ์์ฑ ํ๋ก์ธ์ค ๋น์ฉ์ ์ต์ํํ ์ ์๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ๋ง ์์ฑํ๊ณ ๋์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
( * ๊ฐ์ธ์๊ฒฌ: ์ฑ๊ธํค๊ณผ ์์ฃผ ๋ฎ์์ง๋ง, ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด๊ณผ ์์ด์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. )
์ฅ์ : ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์.
๋จ์ : ๋ฐํ์ ์ ๋ง๋ค ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๋๋ ค์ง ์ ์๋ค.
Playground example
์ฌ๊ธฐ์๋ UIKit์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ํ ์คํธ ํด๋ด ์๋ค.
import UIKit
let red = UIColor.red
let red2 = UIColor.red
print(red === red2)
์์ ์ฝ๋์์ print์ด์ ๊ฒฐ๊ณผ๊ฐ true์ด๋ฏ๋ก ์ฆ, UIColor๊ฐ ํ๋ผ์ด์จ์ดํธ ํจํด์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํฉ๋๋ค. ===๋ฌธ์ ํตํด์ ์์์ ๋น๊ตํ๋ฉด ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋์ผํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฆ, .red๋ ํ๋ผ์ด์จ์ดํธ์ด๋ฉฐ ํ ๋ฒ๋ง ์ธ์คํด์คํ ๋ฉ๋๋ค.
let color = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
let color2 = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
print(color === color2)
์ด๋ฒ์๋ ์ฝ์์ ๊ฒฐ๊ณผ๊ฐ false๋ก ๊ธฐ๋ก๋ฉ๋๋ค. ์ฌ์ฉ์ ์ง์ UI์์ ๊ฐ์ฒด๋ ํ๋ผ์ด์จ์ดํธ๊ฐ ์๋๋๋ค. ์ด ๋ฉ์๋๋ ๋นจ๊ฐ์, ๋ น์, ํ๋์์ ์ฌ์ฉํ๊ณ ํธ์ถ๋ ๋๋ง๋ค ์ UI ์์์ ๋ฐํํฉ๋๋ค.
UIColor๊ฐ ๊ฐ์ ํ์ธํ์ฌ ์์์ด ์ด๋ฏธ ์์ฑ๋์๋์ง ํ์ธํ ๊ฒฝ์ฐ ๋์ ํ๋ผ์ด์จ์ดํธ ์ธ์คํด์ค๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. UIColor extension์ ํตํด์ ํ๋ผ์ด์จ์ดํธ๋ฅผ ๋ฐํํฉ๋๋ค.
extension UIColor {
// 1
public static var colorStore: [String: UIColor] = [:]
// 2
public class func rgba(_ red: CGFloat,
_ green: CGFloat,
_ blue: CGFloat,
_ alpha: CGFloat) -> UIColor {
let key = "\(red)\(green)\(blue)\(alpha)"
if let color = colorStore[key] {
return color
}
// 3
let color = UIColor(red: red,
green: green,
blue: blue,
alpha: alpha)
colorStore[key] = color
return color
}
}
1. ๋์ ๋๋ฆฌ๋ฅผ ์์ฑํ๊ณ , RGBA์ ๊ฐ์ ์ ์ฅํฉ๋๋ค.
2. UIColor ๋ฐฉ๋ฒ์ฒ๋ผ ๋นจ๊ฐ, ํ๋, ์ํ๋ฅผ key๋ก ์ฌ์ฉํฉ๋๋ค. RGB ๊ฐ์ ํค๋ผ๋ ๋ฌธ์์ด์ ์ ์ฅํฉ๋๋ค. ํด๋น ํค๋ฅผ ๊ฐ์ง ์์์ด colorStore์ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ ์ ํค๋ฅผ ๋ง๋๋ ๋์ ํด๋น ํค๋ฅผ ์ฌ์ฉํ์ญ์์ค.
3. ํค๊ฐ ์์ง colorStore์ ์๋ ๊ฒฝ์ฐ UI ์์์ ์์ฑํ๊ณ ํค์ ํจ๊ป ์ ์ฅํฉ๋๋ค.
let flyColor = UIColor.rgba(1, 0, 0, 1)
let flyColor2 = UIColor.rgba(1, 0, 0, 1)
print(flyColor === flyColor2)
์ด์ true๋ฅผ ๋ฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
What should you be careful about?
ํ๋ผ์ด์จ์ดํธ๋ฅผ ๋ง๋ค ๋, ํ๋ผ์ด์จ์ดํธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ผ๋ง๋ ์ปค์ง๋์ง ์ฃผ์ํ์ธ์. ์์ colorStore์์์ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ ํ๋ผ์ด์จ์ดํธ๋ฅผ ์ ์ฅํ๋ ๊ฒฝ์ฐ ๋์ผํ ์์์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ํํ์ง๋ง, ํ๋ผ์ด์จ์ดํธ ์คํ ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํํ๊ธฐ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ํ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ๊ฑฐ๋, ๋ฉ๋ชจ๋ฆฌ ๊ฒฝ๊ณ ์ ๋ฑ๋กํ๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ์ผ๋ถ ํ๋ผ์ด์จ์ดํธ๋ฅผ ์ ๊ฑฐํ์ฌ ๋ฑ๋กํฉ๋๋ค. LRU ์บ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ํ ํ๋ผ์ด์จ์ดํธ shared ์ธ์คํด์ค๋ ๊ตฌ์กฐ๊ฐ ์๋ ํด๋์ค์ฌ์ผ ํฉ๋๋ค. struct๋ copyํ๊ธฐ ๋๋ฌธ์, ref ํ์์ผ๋ก ์์ฑํ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
Tutorial Project
ํ๋ผ์ด์จ์ดํธ ํจํด์ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ์ข๋ค. ํด๋น ์์ ๋ ์ฐธ๊ณ ์ ๋ฃ์ด๋์๋ค.
https://github.com/lgvv/DesignPattern/tree/main/flyweight-pattern
Key points
ํ๋ผ์ด์จ์ดํธ ํจํด์ ๋ํด์ ๋ฐฐ์ ์ต๋๋ค.
- ํ๋ผ์ด์จ์ดํธ ํจํด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฒ๋ฆฌ๋ฅผ ์ต์ํํฉ๋๋ค.
- ์ด ํจํด์๋ ํ๋ผ์ด์จ์ดํธ๋ผ๊ณ ํ๋ ๊ฐ์ฒด์ ์ด๋ฅผ ๋ฐํํ๋ ์ ์ ๋ฉ์๋๊ฐ ์์ต๋๋ค. ์ฑ๊ธํค ํจํด์ ๋ณํ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
- ํ๋ผ์ด์จ์ดํธ๋ฅผ ์์ฑํ ๋ ํ๋ผ์ด์จ์ดํธ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ์ฃผ์ํ์ธ์.
- ํ๋ผ์ด์จ์ดํธ๋ฅผ ์์ฑํ ๋ ํ๋ผ์ด์จ์ดํธ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ์ ์ฃผ์ํ์ธ์! ์ฌ๋ฌ ํ๋ผ์ด์ฐ์ํธ๋ฅผ ์ ์ฅํ๋ ๊ฒฝ์ฐ ํ๋ผ์ด์จ์ดํธ ์ ์ฅ์์์ ๋๋ฌด ๋ง์ ๋ฉ๋ชจ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ๋ผ์ดํธ์จ์ดํธ์ ์๋ก๋ ์ด๋ฏธ์ง์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์บ์ฑํ๊ฑฐ๋, ๋น ๋ฅธ ์ก์ธ์ค๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ์ฒด ํ์ ์ ์งํ๋ ๊ฒ์ด ์์ต๋๋ค.
(์ฐธ๊ณ )
https://icksw.tistory.com/247?category=944177
'apple > ๐ก DesignPattern & Architecture' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Composite Pattern (1) | 2022.06.15 |
---|---|
[Swift] Mediator Pattern (1) | 2022.06.15 |
[Swift] Facade Pattern (1) | 2022.06.07 |
[Swift] Multicast Delegate Pattern (0) | 2022.06.07 |
[Swift] State Pattern (0) | 2022.05.30 |