diff --git a/builder/pom.xml b/builder/pom.xml
new file mode 100644
index 000000000..be94cbe00
--- /dev/null
+++ b/builder/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ builder
+ 1.0-SNAPSHOT
+ builder
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/builder/src/main/java/com/iluwatar/App.java b/builder/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..5d455e95d
--- /dev/null
+++ b/builder/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,31 @@
+package com.iluwatar;
+
+import com.iluwatar.Hero.HeroBuilder;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+
+ Hero mage = new HeroBuilder(Profession.MAGE, "Riobard")
+ .withHairColor(HairColor.BLACK)
+ .withWeapon(Weapon.DAGGER)
+ .build();
+ System.out.println(mage);
+
+ Hero warrior = new HeroBuilder(Profession.WARRIOR, "Amberjill")
+ .withHairColor(HairColor.BLOND)
+ .withHairType(HairType.LONG_CURLY)
+ .withArmor(Armor.CHAIN_MAIL)
+ .withWeapon(Weapon.SWORD)
+ .build();
+ System.out.println(warrior);
+
+ Hero thief = new HeroBuilder(Profession.THIEF, "Desmond")
+ .withHairType(HairType.BOLD)
+ .withWeapon(Weapon.BOW)
+ .build();
+ System.out.println(thief);
+
+ }
+}
diff --git a/builder/src/main/java/com/iluwatar/Armor.java b/builder/src/main/java/com/iluwatar/Armor.java
new file mode 100644
index 000000000..0c7c753b2
--- /dev/null
+++ b/builder/src/main/java/com/iluwatar/Armor.java
@@ -0,0 +1,19 @@
+package com.iluwatar;
+
+public enum Armor {
+
+ CLOTHES, LEATHER, CHAIN_MAIL, PLATE_MAIL;
+
+ @Override
+ public String toString() {
+ String s = "";
+ switch(this) {
+ case CLOTHES: s = "clothes"; break;
+ case LEATHER: s = "leather armor"; break;
+ case CHAIN_MAIL: s = "chain mail"; break;
+ case PLATE_MAIL: s = "plate mail"; break;
+ }
+ return s;
+ }
+
+}
diff --git a/builder/src/main/java/com/iluwatar/HairColor.java b/builder/src/main/java/com/iluwatar/HairColor.java
new file mode 100644
index 000000000..ffac28906
--- /dev/null
+++ b/builder/src/main/java/com/iluwatar/HairColor.java
@@ -0,0 +1,20 @@
+package com.iluwatar;
+
+public enum HairColor {
+
+ WHITE, BLOND, RED, BROWN, BLACK;
+
+ @Override
+ public String toString() {
+ String s = "";
+ switch(this) {
+ case WHITE: s = "white"; break;
+ case BLOND: s = "blond"; break;
+ case RED: s = "red"; break;
+ case BROWN: s = "brown"; break;
+ case BLACK: s = "black"; break;
+ }
+ return s;
+ }
+
+}
diff --git a/builder/src/main/java/com/iluwatar/HairType.java b/builder/src/main/java/com/iluwatar/HairType.java
new file mode 100644
index 000000000..9766b29e2
--- /dev/null
+++ b/builder/src/main/java/com/iluwatar/HairType.java
@@ -0,0 +1,20 @@
+package com.iluwatar;
+
+public enum HairType {
+
+ BOLD, SHORT, CURLY, LONG_STRAIGHT, LONG_CURLY;
+
+ @Override
+ public String toString() {
+ String s = "";
+ switch(this) {
+ case BOLD: s = "bold"; break;
+ case SHORT: s = "short"; break;
+ case CURLY: s = "curly"; break;
+ case LONG_STRAIGHT: s = "long straight"; break;
+ case LONG_CURLY: s = "long curly"; break;
+ }
+ return s;
+ }
+
+}
diff --git a/builder/src/main/java/com/iluwatar/Hero.java b/builder/src/main/java/com/iluwatar/Hero.java
new file mode 100644
index 000000000..1cc8f16df
--- /dev/null
+++ b/builder/src/main/java/com/iluwatar/Hero.java
@@ -0,0 +1,119 @@
+package com.iluwatar;
+
+public class Hero {
+
+ private final Profession profession;
+ private final String name;
+ private final HairType hairType;
+ private final HairColor hairColor;
+ private final Armor armor;
+ private final Weapon weapon;
+
+ public Profession getProfession() {
+ return profession;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public HairType getHairType() {
+ return hairType;
+ }
+
+ public HairColor getHairColor() {
+ return hairColor;
+ }
+
+ public Armor getArmor() {
+ return armor;
+ }
+
+ public Weapon getWeapon() {
+ return weapon;
+ }
+
+ @Override
+ public String toString() {
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(profession);
+ sb.append(" named ");
+ sb.append(name);
+ if (hairColor != null || hairType != null) {
+ sb.append(" with ");
+ if (hairColor != null) {
+ sb.append(hairColor);
+ sb.append(" ");
+ }
+ if (hairType != null) {
+ sb.append(hairType);
+ sb.append(" ");
+ }
+ sb.append(hairType != HairType.BOLD ? "hair" : "head");
+ }
+ if (armor != null) {
+ sb.append(" wearing ");
+ sb.append(armor);
+ }
+ if (weapon != null) {
+ sb.append(" and wielding ");
+ sb.append(weapon);
+ }
+ sb.append(".");
+ return sb.toString();
+ }
+
+ private Hero(HeroBuilder builder) {
+ this.profession = builder.profession;
+ this.name = builder.name;
+ this.hairColor = builder.hairColor;
+ this.hairType = builder.hairType;
+ this.weapon = builder.weapon;
+ this.armor = builder.armor;
+ }
+
+ public static class HeroBuilder {
+
+ private final Profession profession;
+ private final String name;
+ private HairType hairType;
+ private HairColor hairColor;
+ private Armor armor;
+ private Weapon weapon;
+
+ public HeroBuilder(Profession profession, String name) {
+ if (profession == null || name == null) {
+ throw new NullPointerException("profession and name can not be null");
+ }
+ this.profession = profession;
+ this.name = name;
+ }
+
+ public HeroBuilder withHairType(HairType hairType) {
+ this.hairType = hairType;
+ return this;
+ }
+
+ public HeroBuilder withHairColor(HairColor hairColor) {
+ this.hairColor = hairColor;
+ return this;
+ }
+
+ public HeroBuilder withArmor(Armor armor) {
+ this.armor = armor;
+ return this;
+ }
+
+ public HeroBuilder withWeapon(Weapon weapon) {
+ this.weapon = weapon;
+ return this;
+ }
+
+ public Hero build() {
+ return new Hero(this);
+ }
+
+ }
+
+}
diff --git a/builder/src/main/java/com/iluwatar/Profession.java b/builder/src/main/java/com/iluwatar/Profession.java
new file mode 100644
index 000000000..a0e02a994
--- /dev/null
+++ b/builder/src/main/java/com/iluwatar/Profession.java
@@ -0,0 +1,19 @@
+package com.iluwatar;
+
+public enum Profession {
+
+ WARRIOR, THIEF, MAGE, PRIEST;
+
+ @Override
+ public String toString() {
+ String s = "";
+ switch(this) {
+ case WARRIOR: s = "Warrior"; break;
+ case THIEF: s = "Thief"; break;
+ case MAGE: s = "Mage"; break;
+ case PRIEST: s = "Priest"; break;
+ }
+ return s;
+ }
+
+}
diff --git a/builder/src/main/java/com/iluwatar/Weapon.java b/builder/src/main/java/com/iluwatar/Weapon.java
new file mode 100644
index 000000000..b48977b50
--- /dev/null
+++ b/builder/src/main/java/com/iluwatar/Weapon.java
@@ -0,0 +1,20 @@
+package com.iluwatar;
+
+public enum Weapon {
+
+ DAGGER, SWORD, AXE, WARHAMMER, BOW;
+
+ @Override
+ public String toString() {
+ String s = "";
+ switch(this) {
+ case DAGGER: s = "dagger"; break;
+ case SWORD: s = "sword"; break;
+ case AXE: s = "axe"; break;
+ case WARHAMMER: s = "warhammer"; break;
+ case BOW: s = "bow"; break;
+ }
+ return s;
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index fd2984763..c0df9ddaa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,5 +19,6 @@
abstract-factory
+ builder
\ No newline at end of file