>  기사  >  Java  >  Java 디자인 패턴의 프로토타입 패턴에 대한 구체적인 분석

Java 디자인 패턴의 프로토타입 패턴에 대한 구체적인 분석

黄舟
黄舟원래의
2017-08-11 10:00:121157검색

이 글에서는 주로 디자인 패턴의 프로토타입 모드를 소개합니다. 편집자는 이것이 꽤 좋다고 생각합니다. 이제 공유하고 참고하겠습니다. 에디터를 따라 살펴보겠습니다

정의: 프로토타입 인스턴스를 사용하여 생성할 객체의 유형을 지정하고, 이러한 프로토타입을 복사하여 새 객체를 생성합니다.

유형: 클래스 패턴 만들기

클래스 다이어그램:

프로토타입 패턴은 주로 객체를 복사하는 데 사용됩니다. 그 핵심은 클래스 다이어그램의 프로토타입 클래스입니다. Prototype 클래스는 다음 두 가지 조건을 충족해야 합니다.

  • Cloneable 인터페이스를 구현합니다. Java 언어에는 Cloneable 인터페이스가 있는데, 이 인터페이스에는 런타임 시 이 인터페이스를 구현하는 클래스에서 clone 메소드를 사용하는 것이 안전하다는 것을 가상 머신에 알리는 기능이 하나만 있습니다. JVM(Java Virtual Machine)에서는 이 인터페이스를 구현하는 클래스만 복사할 수 있습니다. 그렇지 않으면 런타임 시 CloneNotSupportedException이 발생합니다.

  • Object 클래스의 clone 메소드를 재정의하세요. Java에서는 모든 클래스의 상위 클래스가 Object 클래스에 있으며, 이는 객체의 복사본을 반환하는 데 사용됩니다. 따라서 해당 범위는 일반 클래스에서 호출할 수 없습니다. , Prototype 클래스는 복제해야 합니다. 메소드의 범위가 공개 유형으로 변경됩니다.

프로토타입 패턴은 비교적 간단한 패턴으로, 인터페이스를 구현하고 메소드를 다시 작성하면 프로토타입 패턴이 완성됩니다. 실제 응용 프로그램에서 프로토타입 패턴은 단독으로 나타나는 경우가 거의 없습니다. 종종 다른 패턴과 혼합되어 프로토타입 클래스 Prototype이 추상 클래스로 대체되는 경우가 많습니다.

구현 코드:


class Prototype implements Cloneable { 
  public Prototype clone(){ 
    Prototype prototype = null; 
    try{ 
      prototype = (Prototype)superclone(); 
    }catch(CloneNotSupportedException e){ 
      e.printStackTrace(); 
    } 
    return prototype;  
  } 
} 
 
class ConcretePrototype extends Prototype{ 
  public void show(){ 
    System.out.println("原型模式实现类"); 
  } 
} 
 
public class Client { 
  public static void main(String[] args){ 
    ConcretePrototype cp = new ConcretePrototype(); 
    for(int i=0; i< 10; i++){ 
      ConcretePrototype clonecp = (ConcretePrototype)cpclone(); 
      clonecp.show(); 
    } 
  } 
}

프로토타입 모드의 장점 및 적용 시나리오

프로토타입 모드를 사용하여 객체를 생성하는 것이 객체를 직접 새로 만드는 것보다 성능이 훨씬 좋습니다. 객체 클래스의 복제 메서드가 있기 때문입니다. 로컬 방식은 메모리의 바이너리 스트림을 직접 조작합니다. 특히 대형 객체를 복사할 경우 성능 차이가 매우 뚜렷합니다.

프로토타입 패턴을 사용하는 또 다른 이점은 객체 생성을 단순화하여 문서를 편집할 때 복사하고 붙여넣는 것처럼 쉽게 객체를 생성할 수 있다는 것입니다.

위의 장점 때문에 비슷한 객체를 반복적으로 생성해야 하는 경우 프로토타입 패턴 사용을 고려해 볼 수 있습니다. 예를 들어 루프 본문 내에 객체를 생성해야 하는 경우, 객체 생성 과정이 복잡하거나 루프 수가 많은 경우 프로토타입 패턴을 사용하면 생성 프로세스를 단순화할 수 있을 뿐만 아니라 전반적인 성능을 크게 향상시킬 수 있습니다. 시스템.

프로토타입 패턴에 대한 참고 사항

  • 프로토타입 패턴을 사용하여 객체를 복사하면 클래스의 생성자가 호출되지 않습니다. Object 클래스의 clone 메소드를 호출하여 객체의 복사가 완료되므로 메모리에 직접 데이터를 복사하므로 클래스의 생성자가 호출되지 않습니다. 프로토타입 모드에서는 생성자의 코드가 실행되지 않을 뿐만 아니라 액세스 권한도 무효화됩니다. 싱글턴 패턴을 기억하시나요? 싱글톤 모드에서는 생성자의 접근권한을 private으로 설정하면 싱글톤을 구현할 수 있다. 그러나 clone 메소드는 생성자 메소드의 권한을 직접적으로 무시하므로 싱글톤 모드는 프로토타입 모드와 충돌하므로 사용 시 특별한 주의가 필요하다.

  • 깊은 복사와 얕은 복사. Object 클래스의 clone 메소드는 객체의 기본 데이터 유형만 복사합니다. 배열, 컨테이너 객체, 참조 객체 등은 복사되지 않습니다. Deep Copy를 구현하려면 프로토타입 모드에서 배열, 컨테이너 객체, 참조 객체 등을 별도로 복사해야 합니다. 예를 들면 다음과 같습니다.


public class Prototype implements Cloneable { 
  private ArrayList list = new ArrayList(); 
  public Prototype clone(){ 
    Prototype prototype = null; 
    try{ 
      prototype = (Prototype)superclone(); 
      prototype.list = (ArrayList) this.list.clone(); 
    }catch(CloneNotSupportedException e){ 
      e.printStackTrace(); 
    } 
    return prototype;  
  } 
}

ArrayList는 기본 유형이 아니기 때문에 멤버 변수 목록은 복사되지 않으며 자체적으로 전체 복사를 구현해야 합니다. 다행히 Java에서 제공하는 대부분의 컨테이너 클래스는 Cloneable 인터페이스를 구현합니다. . 따라서 Deep Copy를 구현하는 것은 특별히 어렵지 않습니다.

위 내용은 Java 디자인 패턴의 프로토타입 패턴에 대한 구체적인 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.