Skip to main content

What It Is

The Prototype pattern creates new objects by cloning an existing one instead of building from zero. You prepare one object as a template, then copy it and change only what differs.

The one thing to get right in Go: slices and maps inside a struct are shared by a plain copy — a proper Clone() method copies them too, so the clone is truly independent.


Example: A Document Template

The template carries the parts every document repeats. Clone() copies it — including the tags slice — so editing the copy leaves the template untouched.

Clone, then change the difference

The report got a new title and an extra tag, and the template still has only [draft] — because Clone() copied the slice instead of sharing it.

Prompt
Write a Go program with a Document struct (title, footer, tags slice) and a Clone method that copies the document including its tags slice. Clone a template into a report, change the report's title and add a tag, then print both to show the template was not affected.
Output: Go program and captured output

When to Use It

Use it when new objects are mostly copies of a prepared one — documents from a template, game entities from a spawner, test data from a fixture.

Skip it when objects are cheap to build fresh, or contain nothing shared. For a flat struct of plain values, Go's ordinary assignment is already a copy.


Pros and Cons

Pros: cheap creation of preconfigured objects; the template documents the defaults; no repeated setup code.

Cons: deep copying is easy to get subtly wrong — a forgotten slice or map quietly links clone and original; clones drift from the template silently over time.