문제

프로토타입 디자인 패턴을 진행하면서 몇 가지 질문이 생겼습니다.

나는 프로토타입 디자인 패턴이 메모리나 리소스 측면에서 비용이 많이 드는 객체를 생성하는 데 사용된다는 것을 이해했습니다.이 경우 이미 사용 가능한 개체의 복제본을 사용합니다.

그럼 생성과 차이점은 무엇인가요? new 객체와 clone()?객체는 메모리 어디에 저장되어 있나요?

도움이 되었습니까?

해결책

프로토 타입 디자인 패턴은 두 종류의 시간 절약 및 공간 절약 비용 절감 효과를 제공합니다.

시간 절약은 객체를 만들 때 보조 정보에 값 비싼 액세스가 필요합니다. - 파일, 데이터베이스 또는 네트워크를 통해 구성 데이터를 요청하십시오.예를 들어, 웹 서버에 저장된 템플릿에서 많은 페이지를 구축하는 경우 템플릿을 한 번 읽고 웹 서버를 별도로 쿼리하는 대신 각 새 페이지의 시작점을 가져 오려면 템플릿을 한 번 읽고 복제합니다.각 페이지.

메모리 절감은 불변의 객체를 재사용하는 것에서 나온 것입니다. 원래의 문자열이 많이 포함되어 있으면 새 인스턴스를 만드는 것이 완전히 새로운 불변 문자열을 만들거나 문자열을 수동으로 처리해야합니다.프로토 타입 패턴을 사용하면 클론이 템플릿의 불변 부위를 공유하게 함으로써이 문제를 정상적으로 피할 수 있습니다.

다른 팁

자바 clone() 메서드는 새 개체를 만들고 멤버 변수 값을 해당 개체에 복사합니다.일반적으로 새 개체를 만드는 것보다 비용이 많이 들지도, 덜 들지도 않습니다.유일한 시간 clone() 객체를 생성하는 것보다 저렴할 수 있습니다. new 객체의 생성자가 비용이 많이 드는 작업을 수행하는 경우입니다.예를 들어 생성자가 인수를 가져와서 데이터베이스 쿼리의 일부로 사용했다면 어떻게 될까요?그런 경우에는 clone() 비용이 많이 드는 쿼리 작업이 발생하지 않으므로 비용이 더 저렴해집니다.

하지만 이 디자인 패턴을 사용하는 다른 이유는 다음과 같습니다.대부분 객체를 사용하기 전에 생성자에서 편리하게 수행할 수 없는 복잡한 설정이 필요한 경우입니다.개체에 설정해야 하는 속성이 20개 있다고 가정해 보겠습니다.생성자 매개변수를 사용하여 설정하면 해당 생성자는 끔찍할 정도로 보기 흉할 것입니다. 매개변수가 20개 있는 생성자를 상상해 보세요!대신 매개변수 없이 객체를 생성하고 mutator 메서드를 사용하여 20개의 값을 설정한 다음 clone() 필요할 때 미리 만들어진 복사본을 만드는 개체입니다. clone() 매개 변수가 전혀 필요하지 않으므로 분명히 덜 추악합니다.이 객체의 여러 다른 버전에 대한 여러 복사본이 필요한 경우 프로토타입 패턴이 매력적입니다.

프로토 타입 디자인 패턴은 오브젝트 생성이 너무 많은 시스템 Ressources 및 공연을 수행 할 때 사용되며, 우리가 클래스의 많은 인스턴스를 갖고 싶을 때 정확히이 디자인 패턴을 사용하므로 해당 인스턴스가 비슷합니다. 그래서 우리는 'T는 정말로 비용이 많이 든다는 것을 비싸기 때문에 예를 들어 연산자 "New"와 함께 사용하고 싶습니다.

새로운 객체가 독립적이며 첫 번째 객체로서 너무 많은 ressources가 너무 많이 사용되지 않는다는 것입니다. 여기 에서이 개념을 Java에서 사용하는 예제 :

  import java.util.Vector;

 public class Samsung implements Cloneable{
    private Vector<String> models; 

    public Samsung(){
        models=new Vector<>(); 
        //we suppose in this comments we access to a data Base to get models
        //and then we get a full list of Samsung models
        //... and finish
        //Sadly we took to much of time to fetch the database 
        //we don't want to waste our time again because Samsung rarely update its database
        models.add("Samsung S1"); 
        models.add("Samsung S2"); 
        models.add("galaxy note"); 
        models.add("galaxy star");
    }
    public Samsung(Vector<String> models){
        this.models=models;
    }

   public Samsung clone()  {

      Vector<String> modelsCopy=new Vector<>();
      Samsung samsungCopy=null;
    //here we don't need to access the database again, we will just copy the previous list
      try{
          for(String model:this.models){
              modelsCopy.add(model);
          }
          samsungCopy=new Samsung(modelsCopy); 
          return samsungCopy;
      }
      catch(Exception e){
          return null;
      }
}

}
.

주 프로그램 :

  public static void main(String[] args) {
        Samsung usa_Samsung=new Samsung();
        Samsung morocco_Samsung=usa_Samsung.clone(); 
        System.out.println("original = " + usa_Samsung);
        System.out.println("copy = " + morocco_Samsung);
    }
.

출력 :

original = Samsung@6d06d69c

copy = Samsung@7852e922
.

이 객체가 다르기 때문에 동일한 주소가 아닌 것처럼 보입니다.

메모! 나는 "samsung"이라는 이름을 예로 들었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top