Prototype Pattern

Learn about the prototype design pattern and its uses.

Description

The prototype design pattern is a creational pattern that enables the creation of new objects by cloning existing ones, known as prototypes. Instead of explicitly instantiating objects through constructors or factories, the prototype pattern provides a way to create new objects by copying or cloning existing instances. In this pattern, the responsibility of creating the clone objects is delegated to the actual object that is to be cloned.

When to use

We want to use the prototype pattern in the following scenarios:

  • Avoid complex creation by cloning: We use the prototype pattern when the creation process of the object to be cloned is complex, for example, in cases of handling deeply hierarchical structures filled with attributes we are highly unlikely to alter. Moreover, there might be some private members too, which cannot be directly accessed and would require us to call setters or builders to initialize.

  • Avoid initialization costs from external dependencies: Copying instead of creating a new instance from scratch—this prevents costly operations involved while creating a new object in some cases that involve external dependencies being resolved to determine the base configuration of the object. It could be database queries, file I/O, or any expensive operation required to initialize the object that isn’t likely to update frequently should be cloned instead of created.

  • Work with abstractions effectively: When we want to create a copy of a new object, but it is only available to us as an interface, we might not know which implementing type to instantiate. Therefore, we cannot directly create copies of that object.

When not to use

We avoid using the prototype pattern in the following cases:

  • Simplistic data structures: Avoid using when object creation is relatively simple and inexpensive.

  • Highly varying object instances: Prefer using builder or factory patterns wherever the individuality of every instance is high.

  • Data instances are completely distinct: When objects require only a few but specific pieces of information that cannot be easily achieved through cloning, such as setting unique identifiers or date-time-based fields.

  • Data structures with interdependencies and relationships: Objects having complex relationships or dependencies that are difficult to replicate accurately through cloning are poorly suited to this design. An independent entity can be cloned, but a dependent network of data structures would pose a significant challenge.

Sample code

Let us use the prototype pattern to create a file handling system, where we will instantiate one instance of a file and then use our cloning approach to create subsequent copies.

Get hands-on with 1200+ tech skills courses.