본문 바로가기
스터디/Design Pattern

디자인 패턴 - 프로토타입 패턴 (Prototype Pattern)

by 헤콩 2020. 5. 29.
반응형

프로토타입 패턴 (Prototype Pattern)

 

 

- 생성 패턴 (Creational Pattern) 중 하나

    => 인스턴스를 만드는 절차를 추상화

    => 객체를 생성, 합성하는 방법이나 객체의 표현 방법을 시스템과 분리해줍니다.

    => 무엇이 생성되고, 누가 이것을 생성하는지, 어떻게 생성되는지, 언제 생성되는지 결정하는 데 있어서 유연성을 높일 수 있습니다.

 

- 이미 만들어진 객체를 복사해서 객체를 생성하는 방식

- 어떠한 객체를 여러 개 만들어야 할 경우, 객체 생성에 드는 코딩 분량을 현저히 줄일 수 있다.

- 프로토타입 패턴을 사용하면, 여러 객체 생성 및 초기화에서 발생하는 오버헤드(Overhead)를 줄일 수 있다.

- 클래스로부터 객체를 생성하기 어려운 경우에도 사용


아래 예시에 사용될 Student 객체

import java.util.*;

public class Student implements Cloneable {
    private List<String> students;

    public Student() {
        this.students = new ArrayList<>();
    }
    public Student(List<String> lst) {
        this.students = lst;
    }

    public void dataSetting() {
        this.students.add("a");
        this.students.add("b");
        this.students.add("c");
        this.students.add("d");
    }

    public void addData(String s) {
        this.students.add(s);
    }

    public List<String> getList() {
        return this.students;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        List<String> tmp = new ArrayList<>();
        for (String str : this.students) {
            tmp.add(str);
        }
        return new Student(tmp);
    }
}

 


예시 - 프로토타입 패턴을 사용한 경우

 

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
	// write your code here
        Student stu0 = new Student();
        stu0.dataSetting();
        stu0.addData("e");
        stu0.addData("f");
        stu0.addData("g");
        stu0.addData("h");

        Student stu1 = (Student) stu0.clone();
        Student stu2 = (Student) stu0.clone();
        stu1.addData("x");
        stu2.addData("y");

        System.out.println("stu0 : "+stu0.getList());
        System.out.println("stu1 : "+stu1.getList());
        System.out.println("stu2 : "+stu2.getList());
    }
}

출력 - 프로토 타입 패턴을 사용한 경우

 

 

예시 - 프로토타입 패턴을 사용하지 않은 경우

 

- 같은 결과를 출력하기 위해서 더 많은 코드분량을 필요로 하는 것을 알 수 있다.

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
	// write your code here
        Student stu0 = new Student();
        stu0.dataSetting();
        stu0.addData("e");
        stu0.addData("f");
        stu0.addData("g");
        stu0.addData("h");

        Student stu1 = new Student();
        stu1.dataSetting();
        stu1.addData("e");
        stu1.addData("f");
        stu1.addData("g");
        stu1.addData("h");
        stu1.addData("x");

        Student stu2 = new Student();
        stu2.dataSetting();
        stu2.addData("e");
        stu2.addData("f");
        stu2.addData("g");
        stu2.addData("h");
        stu2.addData("x");
        
        System.out.println("stu0 : "+stu0.getList());
        System.out.println("stu1 : "+stu1.getList());
        System.out.println("stu2 : "+stu2.getList());
    }
}

출력 - 프로토 타입 패턴을 사용하지 않은 경우

 

 

 

 

 

 

참고 :

 

[생성 패턴] 프로토타입 패턴(Prototype Pattern) 이해 및 예제

프로토타입은 주로 실제 제품을 만들기에 앞서 대략적인 샘플 정도의 의미로 사용되는 단어입니다. 프로토타입 패턴은 객체를 생성하는 데 비용(시간과 자원)이 많이 들고, 비슷한 객체가 이미

readystory.tistory.com

 

 

디자인 패턴 정리

안녕하세요~ Jay의 블로그입니다.

realzero0.github.io

반응형

댓글