Prototype in Java
Why read if you can watch?
Watch Prototype's video tutorialPrototype design pattern
- Create a "contract" with
clone()andgetName()entries - Design a "registry" that maintains a cache of prototypical objects
- Populate the registry with an
initializePrototypes()function - The registry has a
findAndClone()"virtual constructor" that can transform a String into its correct object (it callsclone()which then calls "new") - All classes relate themselves to the
clone()contract - 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
