diff --git a/pom.xml b/pom.xml
index ade6285aa..88e3cdfab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,5 +21,6 @@
abstract-factory
builder
factory-method
+ prototype
\ No newline at end of file
diff --git a/prototype/pom.xml b/prototype/pom.xml
new file mode 100644
index 000000000..5f25ca866
--- /dev/null
+++ b/prototype/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ prototype
+ 1.0-SNAPSHOT
+ prototype
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/prototype/src/main/java/com/iluwatar/App.java b/prototype/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..e94c834e3
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,28 @@
+package com.iluwatar;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+ HeroFactory factory;
+ Mage mage;
+ Warlord warlord;
+ Beast beast;
+
+ factory = new HeroFactoryImpl(new ElfMage(), new ElfWarlord(), new ElfBeast());
+ mage = factory.createMage();
+ warlord = factory.createWarlord();
+ beast = factory.createBeast();
+ System.out.println(mage);
+ System.out.println(warlord);
+ System.out.println(beast);
+
+ factory = new HeroFactoryImpl(new OrcMage(), new OrcWarlord(), new OrcBeast());
+ mage = factory.createMage();
+ warlord = factory.createWarlord();
+ beast = factory.createBeast();
+ System.out.println(mage);
+ System.out.println(warlord);
+ System.out.println(beast);
+ }
+}
diff --git a/prototype/src/main/java/com/iluwatar/Beast.java b/prototype/src/main/java/com/iluwatar/Beast.java
new file mode 100644
index 000000000..2d1e978c0
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/Beast.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public abstract class Beast extends Prototype {
+
+ @Override
+ public abstract Beast clone() throws CloneNotSupportedException;
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/ElfBeast.java b/prototype/src/main/java/com/iluwatar/ElfBeast.java
new file mode 100644
index 000000000..40fac06b8
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/ElfBeast.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class ElfBeast extends Beast {
+
+ public ElfBeast() {
+ }
+
+ public ElfBeast(ElfBeast beast) {
+ }
+
+ @Override
+ public Beast clone() throws CloneNotSupportedException {
+ return new ElfBeast(this);
+ }
+
+ @Override
+ public String toString() {
+ return "Elven eagle";
+ }
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/ElfMage.java b/prototype/src/main/java/com/iluwatar/ElfMage.java
new file mode 100644
index 000000000..52919c91d
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/ElfMage.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class ElfMage extends Mage {
+
+ public ElfMage() {
+ }
+
+ public ElfMage(ElfMage mage) {
+ }
+
+ @Override
+ public Mage clone() throws CloneNotSupportedException {
+ return new ElfMage(this);
+ }
+
+ @Override
+ public String toString() {
+ return "Elven mage";
+ }
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/ElfWarlord.java b/prototype/src/main/java/com/iluwatar/ElfWarlord.java
new file mode 100644
index 000000000..51c52afdc
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/ElfWarlord.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class ElfWarlord extends Warlord {
+
+ public ElfWarlord() {
+ }
+
+ public ElfWarlord(ElfWarlord warlord) {
+ }
+
+ @Override
+ public Warlord clone() throws CloneNotSupportedException {
+ return new ElfWarlord(this);
+ }
+
+ @Override
+ public String toString() {
+ return "Elven warlord";
+ }
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/HeroFactory.java b/prototype/src/main/java/com/iluwatar/HeroFactory.java
new file mode 100644
index 000000000..1d663c77f
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/HeroFactory.java
@@ -0,0 +1,11 @@
+package com.iluwatar;
+
+public interface HeroFactory {
+
+ Mage createMage();
+
+ Warlord createWarlord();
+
+ Beast createBeast();
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/HeroFactoryImpl.java b/prototype/src/main/java/com/iluwatar/HeroFactoryImpl.java
new file mode 100644
index 000000000..522b3f45f
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/HeroFactoryImpl.java
@@ -0,0 +1,39 @@
+package com.iluwatar;
+
+public class HeroFactoryImpl implements HeroFactory {
+
+ private Mage mage;
+ private Warlord warlord;
+ private Beast beast;
+
+ public HeroFactoryImpl(Mage mage, Warlord warlord, Beast beast) {
+ this.mage = mage;
+ this.warlord = warlord;
+ this.beast = beast;
+ }
+
+ public Mage createMage() {
+ try {
+ return mage.clone();
+ } catch (CloneNotSupportedException e) {
+ return null;
+ }
+ }
+
+ public Warlord createWarlord() {
+ try {
+ return warlord.clone();
+ } catch (CloneNotSupportedException e) {
+ return null;
+ }
+ }
+
+ public Beast createBeast() {
+ try {
+ return beast.clone();
+ } catch (CloneNotSupportedException e) {
+ return null;
+ }
+ }
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/Mage.java b/prototype/src/main/java/com/iluwatar/Mage.java
new file mode 100644
index 000000000..726150633
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/Mage.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public abstract class Mage extends Prototype {
+
+ @Override
+ public abstract Mage clone() throws CloneNotSupportedException;
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/OrcBeast.java b/prototype/src/main/java/com/iluwatar/OrcBeast.java
new file mode 100644
index 000000000..a5f52232c
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/OrcBeast.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class OrcBeast extends Beast {
+
+ public OrcBeast() {
+ }
+
+ public OrcBeast(OrcBeast beast) {
+ }
+
+ @Override
+ public Beast clone() throws CloneNotSupportedException {
+ return new OrcBeast(this);
+ }
+
+ @Override
+ public String toString() {
+ return "Orcish wolf";
+ }
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/OrcMage.java b/prototype/src/main/java/com/iluwatar/OrcMage.java
new file mode 100644
index 000000000..88e7718ac
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/OrcMage.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class OrcMage extends Mage {
+
+ public OrcMage() {
+ }
+
+ public OrcMage(OrcMage mage) {
+ }
+
+ @Override
+ public Mage clone() throws CloneNotSupportedException {
+ return new OrcMage(this);
+ }
+
+ @Override
+ public String toString() {
+ return "Orcish mage";
+ }
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/OrcWarlord.java b/prototype/src/main/java/com/iluwatar/OrcWarlord.java
new file mode 100644
index 000000000..62ab25975
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/OrcWarlord.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class OrcWarlord extends Warlord {
+
+ public OrcWarlord() {
+ }
+
+ public OrcWarlord(OrcWarlord warlord) {
+ }
+
+ @Override
+ public Warlord clone() throws CloneNotSupportedException {
+ return new OrcWarlord(this);
+ }
+
+ @Override
+ public String toString() {
+ return "Orcish warlord";
+ }
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/Prototype.java b/prototype/src/main/java/com/iluwatar/Prototype.java
new file mode 100644
index 000000000..e508aea6e
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/Prototype.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public abstract class Prototype implements Cloneable {
+
+ @Override
+ public abstract Object clone() throws CloneNotSupportedException;
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/Warlord.java b/prototype/src/main/java/com/iluwatar/Warlord.java
new file mode 100644
index 000000000..4ddcdd251
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/Warlord.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public abstract class Warlord extends Prototype {
+
+ @Override
+ public abstract Warlord clone() throws CloneNotSupportedException;
+
+}