Design Patterns

[Design Patterns] Prototype

우라릭 2024. 2. 25. 00:39

 

 

목차

     

    개요

    이번 글에선 Object Creational Pattern인 프로토타입 패턴을 알아보겠습니다.

    내용

    요약

    만들고자하는 객체를 우선 생성한 다음, 이 객체(프로토타입)를 복사함으로써 새 객체를 생성하자.

    예시

    악보를 그려주는 애플리케이션을 작성한다고 생각해봅시다. 사용자가 화면에서 새로운 음표를 생성했을 때, 어떻게 음표를 생성하면 좋을까요? 이 때 프로토타입 패턴을 사용할 수 있습니다. 프로토타입 패턴은 프로토타입으로 불리는 객체를 우선 생성해두고 이 객체를 복사함으로써 새 객체를 생성하는 방식입니다.

    이 때의 클래스 다이어그램은 아래와 같습니다.

    구조

     

    이야깃거리

    언제 써야 할까?

    • 클래스의 계층구조와 동일하게 만들어야 하는 팩토리 간 계층 구조를 피해야할 때
    • 클래스의 객체가 오직 몇몇 상태의 조합일 때
    • 객체화되는 크래스가 런타임에 결정될 때 (dynamic loading)

    장단점

    • (Pros) 사용자 혹은 시스템으로부터 제품 클래스를 숨겨서 사용자가 알아야 하는 이름의 수를 줄여줍니다.
    • (Cons) 모든 서브클래스가 clone 연산을 오버라이딩해야 한다. 내부 속성으로 clone을 지원하지 않는 객체를 가지고 있을 때 Deep copy가 쉽지 않습니다.

    그 외

    • 초기화를 하기 위해 파라미터를 clone 함수에 넘기는게 일반적으로 어렵습니다. 클래스마다 원하는 인자가 다 다르기 때문에 일관된 clone 인터페이스를 정의하기 어렵기 때문입니다.

    Case Study

    1. Kotlin data class

    Kotlin의 data class 문법은 prototype 패턴의 구현을 염두에 두고 만들어진 것 같습니다. Kotlin은 클래스를 데이터 클래스라는 형태로 정의할 수 있는데 이렇게 클래스를 정의하면 copy()라는 함수가 자동으로 생성됩니다. 이 함수는 데이터 클래스의 property들을 파라미터로 받아, 기존 객체에서 파라미터로 들어온 값들만 바꿔 새로운 객체를 생성합니다. 아래 예제 코드를 참고해주세요.

    // data class 정의 예
    data class User(val name: String, val age: Int)
    // 자동 생성되는 copy 함수의 예
    fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
    val jack = User(name = "Jack", age = 1)
    val olderJack = jack.copy(age = 2)

     

    이 방법을 통해 코틀린에서는 간단한 프로토타입 패턴을 쉽게 구현할 수 있습니다.

     

    출처

    GoF's Design Patterns

    https://kotlinlang.org/docs/data-classes.html#copying

    'Design Patterns' 카테고리의 다른 글

    [Design Patterns] Adapter  (0) 2024.03.16
    [Design Patterns] Singleton  (0) 2024.02.25
    [Design Patterns] Factory Method  (1) 2024.01.27
    [Design Patterns] Builder  (0) 2024.01.20
    [Design Patterns] Abstract Factory  (0) 2024.01.15