[디자인 패턴] Prototype Pattern

전성훈·2023년 11월 1일
0

DesignPattern

목록 보기
5/18
post-thumbnail

주제: 클론 만들기


Prototype pattern은 소프트웨어 디자인 패턴 용어로, 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제하게 된다.
Prototype pattern은 추상 팩토리 패턴과는 반대로, 클라이언트 응용 프로그램 코드 내에서 객체 창조자를 서브 클래스 하는 것을 피할 수 있게 해준다.
프로토타입 패턴은 새로운 객체는 일반적인 방법(예를 들어, new를 사용해서라든지)으로 객체를 생성하는 고유의 비용이 주어진 응용 프로그램 상황에 있어서 불가피하게 매우 클 때, 이 비용을 감내하지 않을 수 있게 해준다. -위키백과

프로토타입 패턴이란

  • 프로토타입 패턴은 생성 디자인 패턴 중 하나로, 이미 생성된 객체의 복사본을 만들어 새로운 객체를 생성하는 방식을 제공한다.
  • 프로토타입 패턴은 주로 객체 생성 비용이 높은 상황에서, 이전 객체를 복제함으로써 새로운 객체를 효율적으로 생성하는 데 사용된다.
    1. 객체 생성 비용이 높고, 비슷한 객체가 여러 번 생성될 때
    2. 런타입에서 새로운 객체를 추가하거나 삭제할 때
    3. 상태 보존을 위해 객체의 스냅샷이 필요한 경우

주요 객체 살펴보기

prototype

예제 코드

  • protocol를 직접 만들어서 활용한 예제
import Foundation

protocol Prototype: AnyObject {
    func clone() -> Self
}

class Dog: Prototype {
    var age: Int
    
    init(age: Int) {
        self.age = age
    }
    
    func clone() -> Self {
        return Dog(age: self.age) as! Self
    }
}

let testDog = Dog(age: 1)
testDog.age += 2
let test2Dog = testDog.clone()

testDog.age += 3

print(test2Dog.age)
print(testDog.age)

// 3
// 6
  • NSCopying 프로토콜을 사용한 예제
class Prototype: NSCopying {
    
    var number: Int
    
    init(number: Int) {
        self.number = number
    }
    
    func copy(with zone: NSZone? = nil) -> Any {
        let copy = Prototype(number: number)
        return copy
    }
}

// 사용 예
let prototype = Prototype(number: 1)
if let copy = prototype.copy() as? Prototype {
    print(copy.number)  // 출력: 1
}

출처(참고문헌)

제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.

감사합니다.

0개의 댓글