diff --git a/pom.xml b/pom.xml index ade6285aa..88e3cdfab 100644 --- a/pom.xml +++ b/pom.xml @@ -21,5 +21,6 @@ <module>abstract-factory</module> <module>builder</module> <module>factory-method</module> + <module>prototype</module> </modules> </project> \ 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 @@ +<?xml version="1.0"?> +<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>com.iluwatar</groupId> + <artifactId>java-design-patterns</artifactId> + <version>1.0-SNAPSHOT</version> + </parent> + <groupId>com.iluwatar</groupId> + <artifactId>prototype</artifactId> + <version>1.0-SNAPSHOT</version> + <name>prototype</name> + <url>http://maven.apache.org</url> + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> +</project> 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; + +}