프로토타입 패턴은 생성할 객체들의 타입이 프로토타입인 인스턴스로 부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제(Clone)합니다.
프로토 타입 패턴을 적용하게 되면, 새로운 객체를 생성하는 고유의 비용이 주어진 상황에 있어서 불가피하게 매우 클 때, 비용을 줄이고 생성할 수 있게 합니다.
public class Employees implements Cloneable {
private List<String> empList;
public Employees(List<String> list) {
this.empList = list;
}
@Override
public Object clone() throws CloneNotSupportedException {
List<String> list = new ArrayList<String>();
for(String emp : this.empList) {
list.add(emp);
}
return new Employees(list);
}
}
위 예제 코드는 clone()을 오버라이딩하고, Cloneable을 구현한 클래스입니다.
자바의 최상위 클래스인 Object를 상속받고, 내부에는 기본적으로 clone() 함수를 갖고 있습니다.

Cloneable을 구현하지 않으면, clone() 메소드 호출 시, CloneNotSupportedException 예외가 발생합니다.
본론으로 돌아가, 위에서 설명한 장점인 "비용을 줄이며 객체를 생성할 수 있다"에 대하여 살펴보겠습니다.
public class Main {
public static void main(String[] args) {
File file = new File("emp.csv");
List<String> empList = parseFile(file);
Employees employees = new Employees(empList);
// ... logic
}
}
위와 같이 emp파일을 읽어와 파싱하는 parseFile()이라는 메소드가 있다고 가정해보겠습니다.
만약, Employees 객체를 다시 한번 생성하려면, File을 다시 한번 읽어야 하고 이는 매우 고비용의 작업입니다.
따라서, Employees의 clone() 함수를 사용하면, 파일을 읽지 않고, 새로운 객체를 생성하여 갖고 올 수 있습니다.
(위는, 파일에 대한 예제이지만, 만약 Employees 객체를 생성하는 과정에서 네트워크 비용 혹은 데이터베이스 쿼리 비용을 통해 새로운 객체를 읽어온다면, Clone 함수를 사용해, 해당 비용보다 저비용으로 객체를 생성할 수 있습니다.)