1인 방문자 패턴
Single-serving visitor pattern컴퓨터 프로그래밍에서 1인용 방문자 패턴은 설계 패턴이다.그 목적은 방문자가 할당되어 한 번만 사용되고 삭제되는(대부분의 방문자의 경우) 구현을 최적화하는 것이다.
적용 가능성
1인용 방문자 패턴은 방문자가 기억에 남을 필요가 없을 때 사용해야 합니다.이는 객체의 계층(예: 방문자 패턴이 복합 패턴과 함께 사용되는 경우)을 방문하여 단일 작업을 수행하는 경우(3D 장면의 카메라 수를 계산하는 경우)에 자주 발생합니다.
일반 방문자 패턴은 방문자가 기억에 남아야 할 때 사용해야 합니다.이 문제는 방문자가 나중에 방문자를 사용하기 위해 메모리에 보관해야 하는 여러 매개 변수로 구성된 경우(3D 장면 렌더러 렌더링 옵션 저장 등)에 발생합니다.
그러나 전체 프로그램에서 이러한 방문자의 인스턴스가 하나만 존재해야 하는 경우, 싱글 서비스 방문자 및 싱글톤 둘 다로 구현하는 것이 좋을 수 있습니다.이것에 의해, 그 파라메타를 변경하지 않고, 1인용 방문자를 나중에 호출할 수 있는 것이 보증된다(이 경우, 1인용 방문자는 여러 번 사용할 수 있기 때문에, 「1인용 방문자」는 언어 남용이다).
사용 예
싱글 서비스 방문자는 스태틱메서드의 중간 경유로 호출됩니다.
- 매개 변수 없음:
요소* 일람; 싱글 서비스 방문자::적용 대상(일람);
- 파라미터 포함:
요소* 일람; 유형 파라미터1, 파라미터2; 싱글 서비스 방문자::적용 대상(일람, 파라미터1, 파라미터2);
- 싱글톤으로서의 구현:
요소* 일람; 유형 파라미터1, 파라미터2; 싱글 서비스 방문자::set_param1(파라미터1); 싱글 서비스 방문자::set_param2(파라미터2); 싱글 서비스 방문자::적용 대상(일람);
결과들
장점
- "좀비" 객체가 없습니다.1인 방문자의 경우 필요할 때 방문자를 배정하고 한 번 쓸모없는 방문자를 파괴할 수 있습니다.
- 방문자보다 간단한 인터페이스.방문자는 apply_to static 메서드 호출만으로 작성, 사용 및 무료입니다.
단점
- 반복 할당apply_to 메서드의 콜마다 싱글 서비스 방문자가 생성되어 폐기됩니다.이것은 시간이 걸립니다.반면 싱글톤은 1개의 할당만 수행합니다.
구현(C++)
기본 구현(파라미터 없음)
// 선언 학급 요소; 학급 요소 A; 학급 요소 B; 학급 싱글 서비스 방문자; ... // [[visitor pattern]]과 동일합니다. // 정의 학급 싱글 서비스 방문자 { 보호되고 있다: 싱글 서비스 방문자(); 일반의: ~싱글 서비스 방문자(); 정적인 무효 적용 대상(요소*); 가상 무효 방문_요소a(요소 A*) = 0; 가상 무효 방문_요소B(요소 B*) = 0; } // 실장 무효 싱글 서비스 방문자::적용 대상(요소* 일람) { 싱글 서비스 방문자 ssv; 일람.받아들이다(ssv); } 매개 변수 전달
싱글 서비스 방문자를 초기화해야 하는 경우 매개변수는 정적 방법을 통해 전달되어야 합니다.
무효 SingleServingVisitor:: apply_to(요소* 일람, 유형 파라미터1, 유형 파라미터2, ...) { 싱글 서비스 방문자 ssv(파라미터1, 파라미터2, ...); 일람.받아들이다(&ssv); } 싱글톤으로서의 구현
이 실장에 의해, 다음의 것이 보증됩니다.
- 1인용 방문객은 기껏해야 한 가지 사례만 있을 뿐이다.
- 방문자에게 나중에 접근할 수 있도록
// 정의 학급 싱글 서비스 방문자 { 보호되고 있다: 정적인 싱글 서비스 방문자* 인스턴스_; 유형 파라미터1_; 유형 파라미터2_; 싱글 서비스 방문자(); 정적인 싱글 서비스 방문자* get_filength(가져오기)(); // 주의: get_instance 메서드는 공개하지 않아도 됩니다. 일반의: ~싱글 서비스 방문자(); 정적인 무효 적용 대상(요소*); // 파라미터에 액세스하기 위한 정적 메서드 정적인 무효 set_param1(유형); 정적인 무효 set_param2(유형); 가상 무효 방문_요소a(요소 A*) = 0; 가상 무효 방문_요소B(요소 B*) = 0; } // 실장 싱글 서비스 방문자* 싱글 서비스 방문자::인스턴스_ = 특수한 순서; 싱글 서비스 방문자* SingleServingVisitor:: get_instance() { 한다면 (이것.->인스턴스_ == 특수한 순서) 이것.->인스턴스_ = 신규 싱글 서비스 방문자(); 돌아가다 이것.->인스턴스_; } 무효 SingleServingVisitor:: apply_to(요소* 일람) { 일람->받아들이다(get_filength(가져오기)()); } 무효 SingleServingVisitor:: set_param1(유형 파라미터1) { get Instance(인스턴스()->파라미터1_ = 파라미터1; } 무효 SingleServingVisitor:: set_param2(유형 파라미터2) { get Instance(인스턴스()->파라미터2_ = 파라미터2; }