Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- transaction
- spring
- 스프링
- 스프링 핵심 기능
- 알고리즘
- http
- pointcut
- 김영한
- 자바
- 그리디
- Servlet
- 인프런
- kotlin
- Android
- 스프링 핵심 원리
- Proxy
- Thymeleaf
- 백준
- JPQL
- AOP
- SpringBoot
- db
- jpa
- JDBC
- Exception
- Spring Boot
- Greedy
- springdatajpa
- QueryDSL
- java
Archives
- Today
- Total
개발자되기 프로젝트
인스턴스 생성 패턴 - Prototype Pattern 본문
1. Prototype Pattern이란?
- 복제해서 인스턴스를 만드는 패턴
2. 의도(intent)와 동기(Motivation)
- 클래스의 인스턴스가 생성과정이 복잡하거나 여러 조합에 의해 생성되어야 하는경우
- 하나의 견본(prototype)을 만들어 초기화해두고 이를 복제해서 객체를 생성하는 방법
3. Class Diagram
- Object 클래스에서 제공하는 clone()을 사용
- clone()메서드가 호출되면 복제됨 ㅋㅋㅋㅋ
4. 객체 협력 (collaborations)
- 복제하는데 필요한
5. 중요한 결론 (consequence)
- 프로토타입 속성값을 활용하여 다양한 객체를 생성할 수 있음
- 서브클래스의 수를 줄일 수 있다.
- 자바에서는 clone() 메서드를 재정의하여 구현한다.
- 객체는 일반적으로 쉽게 바뀌면 안됨.
- clone을 시도한다는 것은 private로 선언한 변수, 메서드까지 가져가겠다는 의미.
- 따라서 clone을 사용하려는 클래스는 Clonnable인터페이스를 구현해야 한다.
- clone()을 재정의 하지 않으면 얕은 복사(참조값만 가져옴)가 이루어 진다.
- 즉 prototype의 내용을 변경하면, clone에도 반영됨.
6. 예제 : Object의 clone()사용
class Book{
private String author;
private String title;
public Book(String author, String title){
this.author = author;
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "(author='" + author + '\'' +
", title='" + title +")";
}
}
class Bookshelf implements Cloneable{
private ArrayList<Book> shelf;
public Bookshelf() {
shelf = new ArrayList<>();
}
public void addBook(Book book){
shelf.add(book);
}
public ArrayList<Book> getShelf() {
return shelf;
}
public void setShelf(ArrayList<Book> shelf) {
this.shelf = shelf;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "shelf=" + shelf;
}
}
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
Bookshelf bookshelf = new Bookshelf();
bookshelf.addBook(new Book("A", "a"));
bookshelf.addBook(new Book("B", "b"));
bookshelf.addBook(new Book("C", "c"));
System.out.println(bookshelf);
Bookshelf another = (Bookshelf) bookshelf.clone();
System.out.println(another);
System.out.println("====================");
bookshelf.getShelf().get(0).setAuthor("AAA");
bookshelf.getShelf().get(0).setTitle("aaa");
System.out.println(bookshelf);
System.out.println(another);
}
}
- 얕은 복사가 이루어 지기 때문에, bookShefl의 0번째 객체를 변경하면,
- clone에도 반영이 된다.
shelf=[(author='A', title='a), (author='B', title='b), (author='C', title='c)]
shelf=[(author='A', title='a), (author='B', title='b), (author='C', title='c)]
====================
shelf=[(author='AAA', title='aaa), (author='B', title='b), (author='C', title='c)]
shelf=[(author='AAA', title='aaa), (author='B', title='b), (author='C', title='c)]
7. 예제 : clone 재정의
- prototype과 clone이 완전히 독립적으로 사용되는 경우.
@Override
protected Object clone() throws CloneNotSupportedException {
Bookshelf another = new Bookshelf();
for (Book book : shelf) {
another.addBook(new Book(book.getAuthor(), book.getTitle()));
}
return another;
}
- prototype의 data를 변경했는데,
- clone에 반영이 안됨.
shelf=[(author='A', title='a), (author='B', title='b), (author='C', title='c)]
shelf=[(author='A', title='a), (author='B', title='b), (author='C', title='c)]
====================
shelf=[(author='AAA', title='aaa), (author='B', title='b), (author='C', title='c)]
shelf=[(author='A', title='a), (author='B', title='b), (author='C', title='c)]
8. GitHub : 211104 Prototype Pattern
'Java > 디자인 패턴' 카테고리의 다른 글
인스턴스 생성 패턴 - Builder Pattern (0) | 2021.11.06 |
---|---|
인스턴스 생성 패턴 - Abstract Factory Pattern (0) | 2021.11.04 |
인스턴스 생성 패턴 - Singleton Pattern (0) | 2021.11.04 |
클래스 다이어그램 (0) | 2021.11.04 |
SOLID 원칙 (0) | 2021.11.04 |
Comments