+[SVG diagram]
ReportRecipe calls IReportBuilder steps in order. TextBuilder and HtmlBuilder produce different representations and return the result through Finish(). In the original GoF structure, GetResult lives on each ConcreteBuilder and the client collects the result; this example puts Finish() on the shared interface because both representations are strings.