The pattern consists of a prototype - an interface of the cloneable classes. A ConcretePrototype implements the clone operations and a client actually clones the prototype instance to use the clones as new objects.
Simple examples
PHP
abstract class BookPrototype { protected $title; protected $topic; abstract function __clone(); function getTitle() { return $this->title; } function setTitle($titleIn) { $this->title = $titleIn; } function getTopic() { return $this->topic; } } class PHPBookPrototype extends BookPrototype { function __construct() { $this->topic = 'PHP'; } function __clone() { } } class SQLBookPrototype extends BookPrototype { function __construct() { $this->topic = 'SQL'; } function __clone() { } } echo("BEGIN \n"); $phpProto = new PHPBookPrototype(); $sqlProto = new SQLBookPrototype(); $book1 = clone $sqlProto; $book1->setTitle('SQL Book prototype'); echo('Book 1 topic: '.$book1->getTopic()."\n"); echo('Book 1 title: '.$book1->getTitle()."\n"); $book2 = clone $phpProto; $book2->setTitle('PHP Book prototype'); echo('Book 2 topic: '.$book2->getTopic()."\n"); echo('Book 2 title: '.$book2->getTitle()."\n"); $book3 = clone $sqlProto; $book3->setTitle('SQL Book prototype II'); echo('Book 3 topic: '.$book3->getTopic()."\n"); echo('Book 3 title: '.$book3->getTitle()."\n"); echo("END\n"); Output: BEGIN Book 1 topic: SQL Book 1 title: SQL Book prototype Book 2 topic: PHP Book 2 title: PHP Book prototype Book 3 topic: SQL Book 3 title: SQL Book prototype II END
Java :
public class proto { interface Xyz { Xyz cloan(); } static class Tom implements Xyz { public Xyz cloan() { return new Tom(); } public String toString() { return "tom prototype"; } } static class Dick implements Xyz { public Xyz cloan() { return new Dick(); } public String toString() { return "dick prototype"; } } static class Harry implements Xyz { public Xyz cloan() { return new Harry(); } public String toString() { return "harry prototype"; } } static class Factory { private static java.util.Mapprototypes = new java.util.HashMap (); static { prototypes.put( "tom", new Tom() ); prototypes.put( "dick", new Dick() ); prototypes.put( "harry", new Harry() ); } public static Xyz makeObject( String s ) { return ((Xyz)prototypes.get(s)).cloan(); } } public static void main( String[] args ) { for (int i=0; i < args.length; i++) { System.out.println( Factory.makeObject( args[i] ) + " " ); } } } Output : $ java proto tom dick harry harry tomtom prototype dick prototype harry prototype harry prototype tom prototype
No comments:
Post a Comment