diff --git a/factory-method/pom.xml b/factory-method/pom.xml
new file mode 100644
index 000000000..5cb761d7a
--- /dev/null
+++ b/factory-method/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ factory-method
+ 1.0-SNAPSHOT
+ factory-method
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/factory-method/src/main/java/com/iluwatar/App.java b/factory-method/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..6b19c5f7e
--- /dev/null
+++ b/factory-method/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,22 @@
+package com.iluwatar;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+ Blacksmith blacksmith;
+ Weapon weapon;
+
+ blacksmith = new OrcBlacksmith();
+ weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
+ System.out.println(weapon);
+ weapon = blacksmith.manufactureWeapon(WeaponType.AXE);
+ System.out.println(weapon);
+
+ blacksmith = new ElfBlacksmith();
+ weapon = blacksmith.manufactureWeapon(WeaponType.SHORT_SWORD);
+ System.out.println(weapon);
+ weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
+ System.out.println(weapon);
+ }
+}
diff --git a/factory-method/src/main/java/com/iluwatar/Blacksmith.java b/factory-method/src/main/java/com/iluwatar/Blacksmith.java
new file mode 100644
index 000000000..fad8382a8
--- /dev/null
+++ b/factory-method/src/main/java/com/iluwatar/Blacksmith.java
@@ -0,0 +1,7 @@
+package com.iluwatar;
+
+public interface Blacksmith {
+
+ Weapon manufactureWeapon(WeaponType weaponType);
+
+}
diff --git a/factory-method/src/main/java/com/iluwatar/ElfBlacksmith.java b/factory-method/src/main/java/com/iluwatar/ElfBlacksmith.java
new file mode 100644
index 000000000..606c913a8
--- /dev/null
+++ b/factory-method/src/main/java/com/iluwatar/ElfBlacksmith.java
@@ -0,0 +1,9 @@
+package com.iluwatar;
+
+public class ElfBlacksmith implements Blacksmith {
+
+ public Weapon manufactureWeapon(WeaponType weaponType) {
+ return new ElfWeapon(weaponType);
+ }
+
+}
diff --git a/factory-method/src/main/java/com/iluwatar/ElfWeapon.java b/factory-method/src/main/java/com/iluwatar/ElfWeapon.java
new file mode 100644
index 000000000..f1c3e6d5c
--- /dev/null
+++ b/factory-method/src/main/java/com/iluwatar/ElfWeapon.java
@@ -0,0 +1,16 @@
+package com.iluwatar;
+
+public class ElfWeapon implements Weapon {
+
+ private WeaponType weaponType;
+
+ public ElfWeapon(WeaponType weaponType) {
+ this.weaponType = weaponType;
+ }
+
+ @Override
+ public String toString() {
+ return "Elven " + weaponType;
+ }
+
+}
diff --git a/factory-method/src/main/java/com/iluwatar/OrcBlacksmith.java b/factory-method/src/main/java/com/iluwatar/OrcBlacksmith.java
new file mode 100644
index 000000000..a99a9b5a5
--- /dev/null
+++ b/factory-method/src/main/java/com/iluwatar/OrcBlacksmith.java
@@ -0,0 +1,9 @@
+package com.iluwatar;
+
+public class OrcBlacksmith implements Blacksmith {
+
+ public Weapon manufactureWeapon(WeaponType weaponType) {
+ return new OrcWeapon(weaponType);
+ }
+
+}
diff --git a/factory-method/src/main/java/com/iluwatar/OrcWeapon.java b/factory-method/src/main/java/com/iluwatar/OrcWeapon.java
new file mode 100644
index 000000000..5ad590158
--- /dev/null
+++ b/factory-method/src/main/java/com/iluwatar/OrcWeapon.java
@@ -0,0 +1,16 @@
+package com.iluwatar;
+
+public class OrcWeapon implements Weapon {
+
+ private WeaponType weaponType;
+
+ public OrcWeapon(WeaponType weaponType) {
+ this.weaponType = weaponType;
+ }
+
+ @Override
+ public String toString() {
+ return "Orcish " + weaponType;
+ }
+
+}
diff --git a/factory-method/src/main/java/com/iluwatar/Weapon.java b/factory-method/src/main/java/com/iluwatar/Weapon.java
new file mode 100644
index 000000000..0787c38f3
--- /dev/null
+++ b/factory-method/src/main/java/com/iluwatar/Weapon.java
@@ -0,0 +1,5 @@
+package com.iluwatar;
+
+public interface Weapon {
+
+}
diff --git a/factory-method/src/main/java/com/iluwatar/WeaponType.java b/factory-method/src/main/java/com/iluwatar/WeaponType.java
new file mode 100644
index 000000000..72e01d82c
--- /dev/null
+++ b/factory-method/src/main/java/com/iluwatar/WeaponType.java
@@ -0,0 +1,19 @@
+package com.iluwatar;
+
+public enum WeaponType {
+
+ SHORT_SWORD, SPEAR, AXE;
+
+ @Override
+ public String toString() {
+ String s = "";
+ switch(this) {
+ case SHORT_SWORD: s = "short sword"; break;
+ case SPEAR: s = "spear"; break;
+ case AXE: s = "axe"; break;
+ }
+ return s;
+ }
+
+
+}
diff --git a/pom.xml b/pom.xml
index c0df9ddaa..bdcc75df8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,5 +20,7 @@
abstract-factory
builder
+ factory-method
+ shared
\ No newline at end of file