ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 프로토타입(Prototype) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:26

    Pattern #3  프로토타입 패턴




     런타임에 그 타입이 결정되는 거의 동일한 객체의 집합을 만들려고 할 때 적용.





     가정
      - 프로토타입이 될 인스턴스르 이미 알고 있어야 한다.
      - 새로운 인스턴스가 필요할 때 언제든지 이를 클론화


     인스턴스 만드는 법
      - New Something();
      - MyPart anotherMyPart = MyPartPrototype.clone();
      



     동기

      

      A회사는 자사의 주력 제품인 "보고서 관리 Class Library"의 upgrade 프로젝트를 결정했으며, 그 개발 팀의 시스템 설계자로 당신이 선발되었다. upgrade는 주로 고객(library를 이용하는 개발자)의 불만사항을 해결하는데 초점이 맞추어져 있다.

     




     - 보고서 관리 Class Library의 현재 상황
      개발자는 실제 보고서 객체(ReportA, ReportB,...) 를 직접 다루지 않고 모두 Report 객체로 간주하여 이용한다.
       => 즉, 실제 보고서 객체는 외부에서 접근하지 못함.
       









     






     - 고객의 불만사항
      특정 Report 객체를 넘겨받아 이를 이용하여 작업을 수행하는데, 넘겨받은 Report 객체와 동일한 Report 객체를 생성해야 하는 경우에는 어떻게 해야 될지 의문.
     
      ex) 현재 Client에서 특정 Report 객체를 가지고 작업 중인데, 이 보고서의 복사본을 생성하기 위해서는 어떻게 해야 하는가??
      (Client는 이 객체가 어떤 타입인지 알 수 없다.)



     

    1
    2
    3
    4
    5
    //client 
    CopyReport(Report *rep) 
    {
        Report *rep2 = new ???
    }
    cs

     


     
    ???에 들어갈 타입이 A인지, B, C 인지 알수 없다.









     - 해결 방안
      특정 객체를 복사해야 하는 경우, 객체 생성과 내용 복사기능을 해당 객체에 맡긴다.


    1
    2
    3
    4
    5
    //client 
    CopyReport(Report *rep) 
    {
        Report *rep2 = rep->clone();
    }
    cs

     




    clone 함수는 실제 구체객체와 동일한 내용을 가지는 객체를 생성해서 반환하는 기능을 제공.

     - 특징
    1. Client에게 구체적 Report 객체로의 접근을 허용하지 않아도 된다.
    2. Client에서 모든 구체적 Report 객체를 알 필요가 없다.
    3. 새로운 구체적 Report 객체가 추가되더라도 기존 Client가 수정될 필요가 없다.
    4. clone함수 내에서 rep의 내용 복사 작업을 수행한다.











    다른 예제를 통해 프로토 타입 패턴에 대해 알아보자.




    Prototype.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    package prototype;
     
    public interface Prototype {
        public void setSize(int x);
     
        public void printSize();
    }
     
    cs





    A.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    package prototype;
     
    public class A implements Prototype, Cloneable {
        private int size;
     
        public A(int size) {
            this.size = size;
        }
     
        public void setSize(int x) {
            this.size = x;
        }
     
        public void printSize() {
            System.out.println("Size : " + size);
        }
     
        public A clone() throws CloneNotSupportedException {
            return (A) super.clone();
        }
     
    }
     
    cs





    ProtoMain.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    package prototype;
     
    public class ProtoMain {
        public static void main(String[] args) throws CloneNotSupportedException {
            A a = new A(1);
     
            for (int i = 2; i < 10; i++) {
                Prototype tmp = a.clone();
                tmp.setSize(i);
                tmp.printSize();
            }
        }
    }
     
    cs




     







     


    댓글

Designed by Tistory.