Creational Patterns
클래스 코드에 종속시키지 않고 기존 객체를 복사할 수 있는 생성 패턴
이미 존재하는 객체의 복사본을 만들고 싶다면?
- 동일한 클래스의 새 객체를 생성
- 원본 객체의 모든 필드를 새 객체에 복사
➡️ Good👍 인 줄 알았지만.. 🙅♂️ ❌
개체의 일부 필드가 비공개로 외부에서 볼 수 없을 경우 복사가 불가능합니다.
또한 복제본을 생성하려면 해당 객체의 클래스를 알아야 하므로 코드가 해당 클래스의 종속됩니다.
➡️ 외부에서 객체를 복사하는 것은 어려운 일
Prototype 패턴은 복제되는 객체에 복제 프로세스를 위임합니다.
복제를 지원하는 모든 객체에 대한 공통 인터페이스를 선언합니다. 인터페이스를 사용하면 코드를 해당 객체의 클래스에 연결하지 않고도 객체를 복사할 수 있습니다. 일반적으로 이런 인터페이스에는 clone
메서드만 포함됩니다.
clone
메서드의 역할
- 현재 클래스의 객체를 만들기
- 이전 객체의 모든 필드 값을 새 객체로 전달
대부분의 언어에서 동일한 클래스에 속한 다른 객체의 private 필드에 접근할 수 있으므로 모든 필드를 복사할 수 있습니다.
이렇게 복제를 지원하는 객체를 Prototype이라고 합니다. 만약 객체가 수많은 필드와 기능을 가지고 있을 때 이를 복제하는 것이 subclassing의 대안이 될 수 있습니다.(❓)
이미 복잡한 객체를 만든 후 설정과 비슷한 객체가 필요하다면 처음부터 새 객체를 생성하는 대신 프로토타입을 복제하면 됩니다.
➡️ 프로토타입이 실제 생산에는 참여하지 않고 수동적인 역할을 함
Prototype 패턴과 더 가까운 비유는 세포의 분열 과정입니다.
세포 분열 후에는 동일한 세포가 형성되는데 본래의 세포는 프로토타입 역할을 하며 새로운 세포를 만드는 데에 적극적인 역할을 합니다.
clone()
clone
메서드를 선언✅ 구체적인 클래스와 연결하지 않고 객체를 복제
✅ 빌드된 프로토타입을 복제하기 위해 반복되는 초기화 코드 제거
✅ 복잡한 객체를 쉽게 생성
✅ 상속을 대신해 복잡한 객체를 미리 구성 가능
❎ 순환 참조가 있는 복잡한 객체의 경우 복제하기 까다로울 수 있음
참고 자료