struct Dog {
let name: String // Up to 20 characters
let age: Int64 // 64-bit integer
let gender: String // 1 character (assuming it's a character)
let breed: String // Up to 65k breeds (assuming it's a string)
let DNA: String // DNA sequence
var description: String {
return "\(name), \(age), \(DNA)"
}
}
let choco = Dog(name: "choco", age: 2, gender: "male", breed: "shihTzu", DNA: "ATAGGCTTACCGATGG...")
let baduk = Dog(name: "baduk", age: 3, gender: "female", breed: "jinDo", DNA: "ATAGGCTTACCGATGG...")
print(choco)
print(baduk)
100메가바이트 용량이 사용되는 강아지가 있다고 해보자
이 강아지를 1000마리 이상 만들게 되면 메모리 부족이 심각해질 수도 있다.
이러한 메모리 사용량을 줄이기위해 공통적인 특성을 공유해서 강아지객체를 만들어줄 수 있다.
struct Dog {
static let DNA = "ATAGGCTTACCGATGG...." // Shared DNA sequence for all dogs
let name: String // Up to 20 characters
let age: Int64 // 64-bit integer
let gender: String // 1 character (assuming it's a character)
let breed: String // Up to 65k breeds (assuming it's a string)
var description: String {
return "\(name), \(age), \(Dog.DNA)"
}
}
let choco = Dog(name: "choco", age: 2, gender: "male", breed: "shihTzu")
let baduk = Dog(name: "baduk", age: 3, gender: "female", breed: "jinDo")
print(choco)
print(baduk)
강아지를 만드는데 사용되는 대부분의 메모리가 DNA에 쏠려있다. 이러한 DNA메모리를 아끼기위해 static을 사용한다
struct DogBreedDNA {
let breed: String
let DNA: String
var description: String {
return "\(DNA)"
}
}
class Dog {
static var DNATable = [String: DogBreedDNA]() // 각 종의 DNA를 딕셔너리로 저장
static func addDNA(breed: String, DNA: String) {
let breedDNA = DogBreedDNA(breed: breed, DNA: DNA)
DNATable[breed] = breedDNA
}
let name: String
let age: Int64
let gender: String
let breed: String
init?(name: String, age: Int64, gender: String, breed: String) {
self.name = name
self.age = age
self.gender = gender
self.breed = breed
if Dog.DNATable[breed] == nil {
print("Error: \(breed) is not in DNA_Table")
return nil
}
}
var description: String {
if let breedDNA = Dog.DNATable[breed] {
return "\(name), \(age), \(breedDNA)"
}
return "\(name), \(age), DNA not found"
}
}
// Example usage:
Dog.addDNA(breed: "ShihTzu", DNA: "ATAGGCTTACCGATGG...")
Dog.addDNA(breed: "Jindo", DNA: "TTAGGCTTACCGATGG...")
if let choco = Dog(name: "choco", age: 2, gender: "male", breed: "ShihTzu") {
print(choco)
}
if let baduk = Dog(name: "baduk", age: 3, gender: "female", breed: "Jindo") {
print(baduk)
}
하지만 만약 강아지마다 DNA정보가 다르다면?
강아지 종과 그에 따른 DNA 정보를 넣는 테이블을 만든다
이후 각 종별 강아지가 만들어질 때마다 이 테이블을 바라보게 한다
결국 Flyweight 패턴의 핵심은 오브젝트 공유를 통한 Memory소비 감소이다!