Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

인스턴스 생성 패턴 - Prototype Pattern 본문

Java/디자인 패턴

인스턴스 생성 패턴 - Prototype Pattern

Seung__ 2021. 11. 4. 22:23

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


 

GitHub - bsh6463/designPattern

Contribute to bsh6463/designPattern development by creating an account on GitHub.

github.com

 

Comments