Prototype in Java

Prototype in Java

Why read if you can watch?

Watch Prototype's video tutorial
read full article

Prototype design pattern

  1. Create a "contract" with clone() and getName() entries
  2. Design a "registry" that maintains a cache of prototypical objects
  3. Populate the registry with an initializePrototypes() function
  4. The registry has a findAndClone() "virtual constructor" that can transform a String into its correct object (it calls clone() which then calls "new")
  5. All classes relate themselves to the clone() contract
  6. Client uses the findAndClone() virtual ctor instead of the "new" operator
interface Prototype {   // 1. The clone()
Object clone(); // contract
String getName();
}
interface Command {
void execute();
}

class PrototypesModule { // 2. "registry" of prototypical objs
private static Prototype[] prototypes = new Prototype[9];
private static int total = 0;
public static void addPrototype( Prototype obj ) {
prototypes[total++] = obj;
}
public static Object findAndClone( String name ) { // 4. The "virtual ctor"
for (int i=0; i < total; i++)
if (prototypes[i].getName().equals( name ))
return prototypes[i].clone();
System.out.println( name + " not found" );
return null;
} }
// 5. Sign-up for the clone()
class This implements Prototype, Command { // contract. Each class
public Object clone() { return new This(); } // calls "new" on itself
public String getName() { return "This"; } // FOR the client.
public void execute() { System.out.println( "This: execute" ); }
}
class That implements Prototype, Command {
public Object clone() { return new That(); }
public String getName() { return "That"; }
public void execute() { System.out.println( "That: execute" ); }
}
class TheOther implements Prototype, Command {
public Object clone() { return new TheOther(); }
public String getName() { return "TheOther"; }
public void execute() { System.out.println( "TheOther: execute" ); }
}

public class PrototypeDemo {
public static void initializePrototypes() { // 3. Populate the "registry"
PrototypesModule.addPrototype( new This() );
PrototypesModule.addPrototype( new That() );
PrototypesModule.addPrototype( new TheOther() );
}
public static void main( String[] args ) {
initializePrototypes();
Object[] objects = new Object[9];
int total = 0;
for (int i=0; i < args.length; i++) { // 6. Client does not use "new"
objects[total] = PrototypesModule.findAndClone( args[i] );
if (objects[total] != null) total++; }
for (int i=0; i < total; i++) ((Command)objects[i]).execute();
} }

C:> java PrototypeDemo Garbage This That Nothing TheOther Garbage not found Nothing not found This: execute That: execute TheOther: execute