[구조패턴] Flyweight Pattern

suojae·2023년 12월 19일
0

[iOS] 디자인패턴

목록 보기
3/10

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소비 감소이다!

profile
Hi 👋🏻 I'm an iOS Developer who loves to read🤓

0개의 댓글