GoF의 디자인 패턴, 플라이급 패턴에 대해 알아본다.
해당 글은, 다음의 코드를 기반으로 이해하는 것이 편리합니다.
Digit
0.txt
와 같은 형태로 저장되어 있다고 하자.DigitFactory
Number
//
// main.swift
// Flyweight
//
// Created by Choiwansik on 2023/01/02.
//
import Foundation
internal func main() {
let number = Number(integer: 434331)
number.print()
}
main()
//
// Number.swift
// Flyweight
//
// Created by Choiwansik on 2023/01/02.
//
import Foundation
internal class Number {
internal init(integer: Int) {
let string = String(integer)
let factory = DigitFactory()
(0..<string.count)
.map { (offset: Int) -> String in
let index = string.index(string.startIndex, offsetBy: offset)
return String(string[index])
}
.compactMap { Int($0) }
.forEach {
self.digitList.append(factory.digit(of: $0))
}
}
internal func print() {
self.digitList.forEach {
$0.print()
}
}
private var digitList = [Digit]()
}
//
// DigitFactory.swift
// Flyweight
//
// Created by Choiwansik on 2023/01/02.
//
import Foundation
internal class DigitFactory {
internal func digit(of integer: Int) -> Digit {
// 0-9 이외의 값이 들어오는 경우는 시간상 제외함
if let digit = self.pool[integer],
digit != nil {
return digit!
} else {
let digit = Digit(filename: "\(integer).txt")
self.pool[integer] = digit
return digit
}
}
private var pool = Dictionary(uniqueKeysWithValues: zip(0...9, [Digit?].init(repeating: nil, count: 10)))
}
//
// Digit.swift
// Flyweight
//
// Created by Choiwansik on 2023/01/02.
//
import Foundation
internal class Digit {
internal init(filename: String) {
self.data = TextReader.read(filename: filename)
}
internal func print() {
Swift.print(self.data)
}
private var data = ""
}
#
##
# #
#####
#
###
#
###
#
###
#
##
# #
#####
#
###
#
###
#
###
###
#
###
#
###
#
#
#
#
#
Digit
)DigitFactory
)client
)client
는 Flyweight
인스턴스를 FlyWeightFactory
에 요청하여 사용한다.Number
와 같은 것, 색상 등등)를 연산해야 함