In computer programming, the single-serving visitor pattern is a design pattern. Its intent is to optimise the implementation of a visitor that is allocated, used only once, and then deleted (which is the case of most visitors).
The single-serving visitor pattern should be used when visitors do not need to remain in memory. This is often the case when visiting a hierarchy of objects (such as when the visitor pattern is used together with the composite pattern) to perform a single task on it, for example counting the number of cameras in a 3D scene.
The regular visitor pattern should be used when the visitor must remain in memory. This occurs when the visitor is configured with a number of parameters that must be kept in memory for a later use of the visitor (for example, for storing the rendering options of a 3D scene renderer).
However, if there should be only one instance of such a visitor in a whole program, it can be a good idea to implement it both as a single-serving visitor and as a singleton. In doing so, it is ensured that the single-serving visitor can be called later with its parameters unchanged (in this particular case "single-serving visitor" is an abuse of language since the visitor can be used several times).
The single-serving visitor is called through the intermediate of static methods.
Element* elem; SingleServingVisitor::apply_to(elem);
Element* elem; TYPE param1, param2; SingleServingVisitor::apply_to(elem, param1, param2);
Element* elem; TYPE param1, param2; SingleServingVisitor::set_param1(param1); SingleServingVisitor::set_param2(param2); SingleServingVisitor::apply_to(elem);
... // Same as with the visitor pattern.
// Definitionclass SingleServingVisitor
// Implementationvoid SingleServingVisitor::apply_to(Element* elem)
If the single-serving visitor has to be initialised, the parameters have to be passed through the static method:
This implementation ensures:
// ImplementationSingleServingVisitor* SingleServingVisitor::instance_ = NULL;
SingleServingVisitor* SingleServingVisitor::get_instance
void SingleServingVisitor::apply_to(Element* elem)
void SingleServingVisitor::set_param1(TYPE param1)
void SingleServingVisitor::set_param2(TYPE param2)