프로토타입 패턴
= 클론 패턴
의도
- 코드를 다른 클래스에 의존시키지 않고 기존 객체들을 복사할 수 있도록하는 디자인 패턴
- 같은 값을 가진 객체를 새롭게 만드는 것보다 기존 객체를 복사하는 것이 시간적으로 더 저렴함
문제
- 객체가 있고 그 객체의 정확한 복사본을 만들고 싶은 경우
- 같은 클래스의 새 객체를 생성한다.
- 원본 객체의 모든 필드 값들을 새 객체에 복사한다.
- 문제
- 객체의 필드들 중 일부가 비공개여서 외부에서 볼 수 없는 경우 복사 불가
- 객체의 복사본을 생성하려면 객체의 클래스를 알아야 함.
→ 내 코드가 해당 클래스에 의존하게 됨.
- 메서드의 매개변수가 일부 인터페이스를 따르는 모든 객체를 수락할 때,
그 객체가 따르는 인터페이스만 알고 그 객체의 구상 클래스를 알지 못할 수도 있음.
= 메서드가 매개변수로 어떤 인터페이스를 구현한 모든 객체를 인자로 받을 때,
이 객체가 구현한 인터페이스만 알고 그 객체의 Concrete Class를 알지 못하는 경우
해결책
- 프로토타입 패턴은 실제로 복제되는 객체들에 복제 프로세스를 위임한다.
- 패턴은 복제를 지원하는 모든 객체에 대한 공통 인터페이스를 선언
- 이 인터페이스를 사용해 코드를 객체의 클래스에 결합하지 않고 해당 객체를 복제 가능
- 일반적으로 이런 인터페이스에는 단일 clone 메서드만 포함
- clone 메서드의 구현은 모든 클래스에서 유사
- clone 메서드는 현재 클래스의 객체를 만들고 이전 객체의 모든 필드 값을 새 객체로 전달
- 대부분의 언어는 객체들이 같은 클래스에 속한 다른 객체의 비공개 필드들에 접근할 수 있도록 허용하므로 비공개 필드들을 복사하는 것도 가능
- 복제를 지원하는 객체 = 프로토타입
프로토타입의 작동
- 다양한 방식으로 설정되어 있는 객체들 생성
- 설정한 것들 중 비슷한 객체가 필요한 경우 새 객체를 만드는 대신 프로토타입을 복제
복사의 종류
- 얕은 복사
- 객체를 공유하는 방식으로 복사
- 공유 : 객체 복사 시, 새로운 자원을 할당받지 않고 객체를 복사
- 실제 변수를 복사하는 것이 아닌 포인터가 원본을 가리키게 하는 것
...
Class obj_1 = new Class();
Class obj_2 = obj_1;
...
- 깊은 복사
- 물리적으로 다른 메모리 영역을 할당받아 변수를 복사
실제상황 적용
- 실제 산업에서 프로토타입은 제품의 대량 생산을 시작하기 전 다양한 테스트 수행에 사용됨.
하지만 프로그래밍의 프로토타입은 실제 생산 과정에 참여하지 않고 수동적인 역할을 수행.
- 실제 산업 프로토타입들은 실제로 자신을 복제하지 않음.
때문에 프로토타입 패턴에 더 가까운 예시는 세포의 유사분열 과정임
= 유사 분열 후에는 한 쌍의 같은 세포가 형성됨
- 원본 세포는 프로토타입 역할을 하며 복사본을 만드는 능동적인 역할을 수행.
구조
![](https://velog.velcdn.com/images/jhk0701/post/04d0ab35-9002-488d-8e46-69c9eeaaea2c/image.png)