2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								layout: pattern
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								title: Prototype
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								folder: prototype
							 
						 
					
						
							
								
									
										
										
										
											2015-08-15 18:03:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								permalink: /patterns/prototype/
							 
						 
					
						
							
								
									
										
										
										
											2015-08-20 21:40:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								categories: Creational
							 
						 
					
						
							
								
									
										
										
										
											2021-05-19 10:49:05 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								language: en
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 18:25:56 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								tags: 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 -  Gang Of Four
							 
						 
					
						
							
								
									
										
										
										
											2019-12-13 21:09:28 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 -  Instantiation
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								## Intent
 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-01 20:06:47 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Specify the kinds of objects to create using a prototypical instance, and create new objects by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								copying this prototype.
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								## Explanation
 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 16:45:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								First, it should be noted that the Prototype pattern is not used to gain performance benefits. It's only 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								used for creating new objects from prototype instances.
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 16:45:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Real-world example
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-09-01 20:06:47 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								>  Remember Dolly? The sheep that was cloned! Lets not get into the details but the key point here is 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								>  that it is all about cloning.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								In plain words
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								>  Create an object based on an existing object through cloning.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Wikipedia says
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-09-01 20:06:47 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								>  The prototype pattern is a creational design pattern in software development. It is used when the 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								>  type of objects to create is determined by a prototypical instance, which is cloned to produce new 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								>  objects.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-09-01 20:06:47 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								In short, it allows you to create a copy of an existing object and modify it to your needs, instead 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								of going through the trouble of creating an object from scratch and setting it up.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								**Programmatic Example**
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								In Java, the prototype pattern is recommended to be implemented as follows. First, create an
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								interface with a method for cloning objects. In this example, `Prototype`  interface accomplishes
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								this with its `copy`  method.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-28 01:35:43 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```java
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								public interface Prototype {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Object copy();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Our example contains a hierarchy of different creatures. For example, let's look at `Beast`  and
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`OrcBeast`  classes.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```java
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								@EqualsAndHashCode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								@NoArgsConstructor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								public abstract class Beast implements Prototype {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  public Beast(Beast source) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  @Override 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  public abstract Beast copy();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								@EqualsAndHashCode (callSuper = false)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								@RequiredArgsConstructor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								public class OrcBeast extends Beast {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  private final String weapon;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  public OrcBeast(OrcBeast orcBeast) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    super(orcBeast);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    this.weapon = orcBeast.weapon;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  @Override 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  public OrcBeast copy() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return new OrcBeast(this);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  @Override 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  public String toString() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return "Orcish wolf attacks with " + weapon;
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								We don't want to go into too much details, but the full example contains also base classes `Mage` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and `Warlord`  and there are specialized implementations for those for elves in addition to orcs.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								To take full advantage of the prototype pattern, we create `HeroFactory`  and `HeroFactoryImpl` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								classes to produce different kinds of creatures from prototypes.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```java
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								public interface HeroFactory {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Mage createMage();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Warlord createWarlord();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Beast createBeast();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								@RequiredArgsConstructor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								public class HeroFactoryImpl implements HeroFactory {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  private final Mage mage;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  private final Warlord warlord;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  private final Beast beast;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  public Mage createMage() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return mage.copy();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  public Warlord createWarlord() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return warlord.copy();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  public Beast createBeast() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return beast.copy();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Now, we are able to show the full prototype pattern in action producing new creatures by cloning
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								existing instances.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-28 01:35:43 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```java
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    var factory = new HeroFactoryImpl(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        new ElfMage("cooking"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        new ElfWarlord("cleaning"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        new ElfBeast("protecting")
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    var mage = factory.createMage();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    var warlord = factory.createWarlord();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    var beast = factory.createBeast();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    LOGGER.info(mage.toString());
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    LOGGER.info(warlord.toString());
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    LOGGER.info(beast.toString());
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    factory = new HeroFactoryImpl(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        new OrcMage("axe"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        new OrcWarlord("sword"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        new OrcBeast("laser")
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    );
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    mage = factory.createMage();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    warlord = factory.createWarlord();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    beast = factory.createBeast();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    LOGGER.info(mage.toString());
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    LOGGER.info(warlord.toString());
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    LOGGER.info(beast.toString());
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Here's the console output from running the example.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Elven mage helps in cooking
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Elven warlord helps in cleaning
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Elven eagle helps in protecting
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Orcish mage attacks with axe
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Orcish warlord attacks with sword
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Orcish wolf attacks with laser
							 
						 
					
						
							
								
									
										
										
										
											2017-08-16 21:09:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-07 20:01:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								## Class diagram
 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-01 20:06:47 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-07 20:01:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								## Applicability
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-09-01 20:06:47 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Use the Prototype pattern when a system should be independent of how its products are created, 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								composed, represented and
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  When the classes to instantiate are specified at run-time, for example, by dynamic loading.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  To avoid building a class hierarchy of factories that parallels the class hierarchy of products.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  When instances of a class can have one of only a few different combinations of state. It may be 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								more convenient to install a corresponding number of prototypes and clone them rather than 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								instantiating the class manually, each time with the appropriate state.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  When object creation is expensive compared to cloning.
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								## Known uses
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-15 18:03:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  [java.lang.Object#clone() ](http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#clone%28%29 )
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 18:25:56 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								## Credits
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-22 18:25:56 +05:30 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-06 13:31:07 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  [Design Patterns: Elements of Reusable Object-Oriented Software ](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59 )
							 
						 
					
						
							
								
									
										
										
										
											2020-07-07 18:05:11 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  [Head First Design Patterns: A Brain-Friendly Guide ](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b )