목차
개요
이번 글에선 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
'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 |