728x90
반응형
프로토타입 패턴(Prototype Pattern)
클래스의 인스턴스를 생성할 때 자원과 시간이 많이 들거나 복잡하다면 프로토타입 패턴을 사용하면 됩니다.
프로토타입 패턴을 사용하면 기존 인스턴스를 복사하기만 해도 새로운 인스턴스를 만들 수 있습니다.(java
에서는 clone()
메소드를 사용하거나 역직렬화를 하면 됩니다.^^)
본래의 객체를 새로운 객체에 복사하여 우리의 필요에 따라 수정하는 메커니즘을 제공합니다.
프로토타입 패턴을 가장 큰 특징은 클라이언트에서 어떤 클래스의 인스턴스를 만드는지 전혀 모르는 상태에서도 새로운 인스턴스를 만들 수 있다는 점 입니다.
프로토 타입 패턴 구조
깊은 복사, 얇은 복사
깊은 복사와 얇은 복사에 대해서 들어본적이 있으신가요?
먼저, 우리는 모든 데이터 타입은 값 타입(primitive type
), 참조 타입(reference type
)을 가진다는 것을 인지하고 있어야 합니다. Java의 데이터 타입의 분류(기본 타입, 참조 타입)와 메모리 영역
- 기본 타입
- 실제 데이터 값을 저장 하는 타입
- 참조 타입
- 객체의 주소를 저장하는 타입
프로토타입 패턴 그리고 깊은 복사, 얇은 복사
Employees
public class Employees implements Cloneable {
private List<String> empList;
public Employees() {
this.empList = new ArrayList<>();
}
public Employees(List<String> list) {
this.empList = list;
}
public void loadData() {
empList.add("Kim");
empList.add("Park");
empList.add("Jang");
}
public List<String> getEmpList() {
return empList;
}
public void add(String str) {
System.out.println(str+" 추가");
empList.add(str);
}
/**
* 깊은 복사
* 객체의 실제 값을 복사한다.(참조를 공유하지 않는다.)
* clone() 메소드를 재정의하기 위해 Cloneable 인터페이스를 구현
*/
@Override
protected Object clone() throws CloneNotSupportedException {
List<String> temp = new ArrayList<>();
for (String s : empList) {
temp.add(s);
}
return new Employees(temp);
}
}
Client
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Employees emps = new Employees();
emps.loadData();
Employees deepCopy = (Employees) emps.clone(); //깊은 복사
Employees shallowCopy = emps; //얇은 복사
System.out.println("original = "+emps.getEmpList()+", "+emps);
deepCopy.add("깊은 밍밍이");
shallowCopy.add("얇은 싱싱이");
System.out.println("original = "+emps.getEmpList()+", "+emps);
System.out.println("deepCopy = "+deepCopy.getEmpList()+", "+deepCopy);
System.out.println("shallowCopy = "+shallowCopy.getEmpList()+", "+shallowCopy);
}
}
결과
original = [Kim, Park, Jang], kr.ac.uos.designpattern.practice.prototype.Employees@6c629d6e
깊은 밍밍이 추가
얇은 싱싱이 추가
original = [Kim, Park, Jang, 얇은 싱싱이], kr.ac.uos.designpattern.practice.prototype.Employees@6c629d6e
deepCopy = [Kim, Park, Jang, 깊은 밍밍이], kr.ac.uos.designpattern.practice.prototype.Employees@b065c63
shallowCopy = [Kim, Park, Jang, 얇은 싱싱이], kr.ac.uos.designpattern.practice.prototype.Employees@6c629d6e
얇은 복사는 주소 값이 동일한 것을 알수 있고, 깊은 복사는 인스턴스가 새로 생성됨을 알 수 있다.
반응형
프로토타입 패턴의 장단점
장점
- 클라이언트는 새로운 인스턴스를 만드는 과정을 몰라도 됩니다.!
- 클라이언트는 구체적인 형식을 몰라도 객체를 생성할 수 있습니다.
- 상황에 따라서 객체를 생성하는 것보다 복사하는것이 효율적일 수 있습니다.
- 시스템에서 복잡한 클래스 계층구조에 있는 다양한 형식의 객체 인스턴스를 새로 만들어야 할 때 유용하게 사용 가능합니다.^^
단점
- 객체의 복사본을 만드는 작업이 매우 복잡할 수도 있습니다.
728x90
반응형
'컴퓨터과학 > 0 + 소프트웨어 아키텍처(디자인 패턴)' 카테고리의 다른 글
[소프트웨어 아키텍처] 15. 어댑터 패턴, 퍼사드 패턴(Adapter Pattern, Facade Pattern -java) (1) | 2022.12.08 |
---|---|
[소프트웨어 아키텍처] 14. 데코레이터 패턴(Decorator Pattern -java) (0) | 2022.12.07 |
[소프트웨어 아키텍처] 12. 빌더 패턴(Builder Pattern -java) (0) | 2022.12.06 |
[소프트웨어 아키텍처] 11. 싱글톤 패턴(Singleton Pattern -java) (0) | 2022.12.06 |
[소프트웨어 아키텍처] 10. 중재자 패턴(Mediator Pattern -java) (0) | 2022.12.05 |