From a4b58fe06ef0278165c334c4ff79cdae000ebc12 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sat, 9 Aug 2014 22:38:07 +0300 Subject: [PATCH] added builder sample --- builder/pom.xml | 23 ++++ builder/src/main/java/com/iluwatar/App.java | 31 +++++ builder/src/main/java/com/iluwatar/Armor.java | 19 +++ .../src/main/java/com/iluwatar/HairColor.java | 20 +++ .../src/main/java/com/iluwatar/HairType.java | 20 +++ builder/src/main/java/com/iluwatar/Hero.java | 119 ++++++++++++++++++ .../main/java/com/iluwatar/Profession.java | 19 +++ .../src/main/java/com/iluwatar/Weapon.java | 20 +++ pom.xml | 1 + 9 files changed, 272 insertions(+) create mode 100644 builder/pom.xml create mode 100644 builder/src/main/java/com/iluwatar/App.java create mode 100644 builder/src/main/java/com/iluwatar/Armor.java create mode 100644 builder/src/main/java/com/iluwatar/HairColor.java create mode 100644 builder/src/main/java/com/iluwatar/HairType.java create mode 100644 builder/src/main/java/com/iluwatar/Hero.java create mode 100644 builder/src/main/java/com/iluwatar/Profession.java create mode 100644 builder/src/main/java/com/iluwatar/Weapon.java 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