Gof의 디자인 패턴 - 프로토타입

Groot·2023년 12월 10일
0

TIL

목록 보기
136/153
post-thumbnail
post-custom-banner

프로토타입

  • 생성패턴
  • 코드를 그들의 클래스들에 의존시키지 않고 기존 객체들을 복사할 수 있도록 하는 생성 디자인 패턴

활용성

  • 제품의 생성, 복합, 표현 방법에 독립적인 제품을 만들 때 사용한다.
  • 인스턴스화할 클래스를 런타임에 지정할 때(동적로딩)
  • 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화시키고 싶을 때

구조

요소

  • 프로토타입
    • clone 메서드 인터페이스 제공
  • 구체화 된 프로토타입
    • 자신을 복제하는 clone 연산 구현
  • 클라이언트
    • 프로토타입에 복제를 요청하여 새로운 객체를 생성한다.

장점

  • 런타임에 새로운 객체 추가 및 삭제 가능
  • 반복되는 초기화 코드를 제거한 후 그대신 미리 만들어진 프로토타입을 복제하는 방법 사용 가능
  • 복잡한 객체들을 더 쉽게 생성할 수 있다.
  • 복잡한 객체들에 대한 설정들을 처리할 때 상속 대신 사용할 수 있는 방법

단점

  • 순환 참조가 있는 복잡한 객체들을 복제하는 것은 매우 까다로울 수 있다.

스위프트에선 NSCoping 인터페이스를 사용하여 쉽게 구현할 수 있다

예시 코드


protocol ProductPrototype: NSCopying {
    var id: String { get }
    var name: String { get }
    var price: Int { get set }
    var image: String { get }
    var stock: Int { get }
    var event: String { get set }
}

class Product: ProductPrototype {
    let id: String
    let name: String
    var price: Int
    let image: String
    let stock: Int
    var event: String

    init(id: String, name: String, price: Int, image: String, stock: Int, event: String) {
        self.id = id
        self.name = name
        self.price = price
        self.image = image
        self.stock = stock
        self.event = event
    }

    func copy(with zone: NSZone? = nil) -> Any {
        return Product(
            id: id,
            name: name,
            price: price,
            image: image,
            stock: stock,
            event: event
        )
    }
}

struct Store {
    let product: ProductPrototype = Product(id: "1", name: "칸쵸", price: 1000, image: "", stock: 10, event: "")

    func 백원딜() -> ProductPrototype {
        let 백원딜상품 = product.copy() as! ProductPrototype
        백원딜상품.price = 100
        백원딜상품.event = "백원딜"

        return 백원딜상품
    }

    func 천원딜상품() -> ProductPrototype {
        let 천원딜상품 = product.copy() as! ProductPrototype
        천원딜상품.price = 1000
        천원딜상품.event = "천원딜"

        return 천원딜상품
    }
}

참고

profile
I Am Groot
post-custom-banner

0개의 댓글