Latest web development tutorials

프로토 타입 모델

프로토 타입 모델 (프로토 타입 패턴) 성능을 보장하면서, 중복 객체를 생성하는 데 사용됩니다. 디자인 패턴이 유형의 개체를 만들 수있는 가장 좋은 방법을 제공하는 스키마를 작성 속한다.

이 모델은 현재 개체의 복제를 만드는 데 사용되는 프로토 타입 인터페이스입니다. 객체를 생성하는 직접 비용은 상대적으로 큰 경우,이 모델을 사용. 데이터베이스 비싼 연산 후 예를 들어, 객체가 생성 될 필요가있다. 다음 번을 개체에게 데이터베이스 호출을 줄이기 위해 그 클론 데이터베이스를 업데이트하는 데 필요한 시간으로 복귀하기위한 요청을 캐싱 할 수있다.

소개

의도 : 지정된 개체 유형의 인스턴스를 생성하고 프로토 타입을 복사하여 새 개체를 만드는 데 사용되는프로토 타입.

주로 해결하려면 만들고 런타임에 프로토 타입을 삭제.

때 사용 : 1, 시스템이 자사의 제품 제작, 구성 및 표현의 독립시기.이 클래스의 인스턴스가 동적 로딩, 예를 들어, 실행시에 지정 될 때. 3, 위해 병렬 클래스 계층 구조 및 제품 계층 구조 때 팩토리 클래스를 생성 방지 할 수 있습니다. (4)는 클래스의 인스턴스는 하나의 시간에 상태의 몇 가지 조합을 가질 수있는 경우. 프로토 타입의 대응하는 번호를 설정하고 수동 클래스의 인스턴스의 적절한 상태마다보다 편리 할 수있다 이들을 복제.

기존의 프로토 타입객체의 사용을 신속 인스턴스로 프로토 타입 객체가 생성 : 해결하는 방법.

키 코드 1은, 복제 동작 JAVA 상속 Cloneable을 달성하기 위해, 클론 (), 재기록 전체 복사본을 달성하기 위해 단순 복사본 직렬화 방법의 목적을 달성하기 위해, () 메소드 닷넷 객체 클래스 MemberwiseClone에 사용될 수있다.도 2는 사용자와 클래스 객체의 특정 유형 (가변형) 사이에 분리 결합하는 동일한 원형 모델들은 또한 이러한 "변수 타입을"안정된 인터페이스를 가지고 있어야.

적용 예 : 1, 세포 분열.2, 개체 복제 () 메소드에 JAVA.

장점 : (1)는, 성능이 향상된다.이 제약 생성자를 탈출.

단점 : 1, 클로닝 방법이 고려에 새 클래스는 어렵지 않다 기능의 클래스를 취할 필요하지만, 기존의 클래스 특히 클래스 참조 간접 객체의 직렬화를 지원하지 않는 경우, 매우 쉽지 않을 수있다, 또는 환상 구조는 시간에 대한 참조를 포함.2, Cloneable 인터페이스를 구현해야합니다. 3, 제약 생성자를 피하십시오.

사용 시나리오 : 1, 리소스 최적화 시나리오.2 클래스 초기화는 자원 데이터, 하드웨어 자원을 포함한 많은 자원을 소화 할 필요가있다. 3, 성능 및 현장의 안전 요구 사항. 새로운 객체를 생성하는 매우 지루한 준비 또는 데이터 액세스를 필요로하여 4, 당신은 프로토 타입 모델을 사용할 수 있습니다. 5 장면 의해 변형 복수의 오브젝트. 6 개체가 다른 개체에 대한 액세스를 제공해야하고, 각 호출은, 그 값을 수정 호출자가 사용하는 객체의 여러 사본에 대한 프로토 타입 모델을 사용하여 고려할 필요가있다. 도 7은, 실제의 프로젝트에서 원형 모델은 거의 단독으로 발생하지 않고, 공장에있어서의 패턴은 일반적으로 함께 나타나는 물체 클론 방식을 만들고 공장 방법으로 발신자에게 제공했다. 자바 원형 모델 일체 전체적으로 통합되어, 그것을 용이하게 사용하기 위해 사용될 수있다.

참고 : 새 개체를 구성하는 인스턴스에 의해 클래스가 다르다으로, 프로토 타입 모델은 기존 개체를 복사하여 새로운 객체를 생성하는 것입니다.얕은 복사 깊은 복사는 Serializable를 구현하여 이진 스트림을 읽어, 다시, Cloneable을 실현.

실현

우리는 추상 클래스모양을만들고 엔티티 클래스모양 클래스를확장합니다. 다음 단계는그러한물체의 형상의해시 테이블에저장되어있는 클래스ShapeCache를정의하고, 요청시 이들 클론으로 돌아 간다.

PrototypPatternDemo는ShapeCache 클래스를 사용하여 우리의 데모 클래스는Shape객체를 얻을 수 있습니다.

프로토 타입 모델 UML 다이어그램

1 단계

인터페이스복제 가능을구현하는 추상 클래스를만듭니다.

Shape.java

공개 추상 클래스 모양에서 복제를 {구현
   
   개인 문자열 아이디;
   보호 문자열 입력]
   
   추상 무효 추첨 ();
   
   공공 문자열 getType로 () {
      형식을 반환;
   }
   
   공공 문자열 getId () {
      ID를 반환;
   }
   
   공공 무효 setId (문자열 ID) {
      this.id = 아이디;
   }
   
   공공 개체 복제 () {
      클론 = null이 객체;
      {시도
         클론 = super.clone에 ();
      } 캐치 (예외 : CloneNotSupportedException 전자) {
         e.printStackTrace ();
      }
      복제를 반환;
   }
}

2 단계

위의 추상 클래스를 확장 엔티티 클래스를 만듭니다.

Rectangle.java

공용 클래스 직사각형 모양을 {확장

   공공 직사각형 () {
     = "직사각형"를 입력;
   }

   @Override
   공공 무효 무승부 () {
      에서 System.out.println ( "내부 사각형 :: 무승부 () 메소드.");
   }
}

Square.java

공용 클래스 광장 모양을 {확장

   공공 광장 () {
     = "광장"을 입력;
   }

   @Override
   공공 무효 무승부 () {
      에서 System.out.println ( "내부 광장 :: 무승부 () 메소드.");
   }
}

Circle.java

공용 클래스 서클 모양을 {확장

   공공 원 () {
     = "원"을 입력;
   }

   @Override
   공공 무효 무승부 () {
      에서 System.out.println ( "내부 서클 :: 무승부 () 메소드.");
   }
}

3 단계

해시 테이블을,클래스를 만들고 데이터베이스에서 엔티티 클래스를 얻을, 저장.

ShapeCache.java

수입 java.util.Hashtable에;

공용 클래스 ShapeCache {
	
   개인 정적의 Hashtable <문자열, 모양> shapeMap 
      = 새로운 해시 테이블 <문자열, 모양> ();

   공공 정적 모양 getShape (문자열 shapeId) {
      cachedShape = shapeMap.get (shapeId를) 모양;
      리턴 (모양) cachedShape.clone ();
   }

   // 각각의 모양이 운영하는 데이터베이스 쿼리, 그리고 모양 // shapeMap.put (shapeKey, 모양)을 생성;
   // 예를 들어, 우리는 () {공공 정적 무효 loadCache을 세 가지 모양을 추가 할
      원 원 = 새로운 서클 ();
      circle.setId ( "1");
      shapeMap.put (circle.getId (), 원)

      스퀘어 광장 = 새로운 광장 ();
      square.setId ( "2");
      shapeMap.put (square.getId (), 사각형);

      사각형 사각형 = 새로운 Rectangle ();
      rectangle.setId ( "3");
      shapeMap.put (rectangle.getId (), 사각형);
   }
}

4 단계

PrototypePatternDemo는복제의형상이 해시 테이블에저장되어 얻을ShapeCache 클래스를 사용합니다.

PrototypePatternDemo.java

공용 클래스 PrototypePatternDemo {
   공공 정적 무효 메인 (문자열 []에 args) {
      ShapeCache.loadCache ();

      clonedShape = (형상) ShapeCache.getShape 형상 ( "1");
      에서 System.out.println ( "모양 :"+ clonedShape.getType ());		

      clonedShape2 = (모양) ShapeCache.getShape 모양 ( "2");
      에서 System.out.println ( "모양 :"+ clonedShape2.getType ());		

      clonedShape3 = (모양) ShapeCache.getShape 모양 ( "3");
      에서 System.out.println ( "모양 :"+ clonedShape3.getType ());		
   }
}

5 단계

출력을 확인합니다.

모양 : 원
모양 : 광장
모양 : 직사각형