added builder sample

This commit is contained in:
Ilkka Seppala 2014-08-09 22:38:07 +03:00
parent 959a1f63ba
commit a4b58fe06e
9 changed files with 272 additions and 0 deletions

23
builder/pom.xml Normal file
View File

@ -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>builder</artifactId>
<version>1.0-SNAPSHOT</version>
<name>builder</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>

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -19,5 +19,6 @@
</properties> </properties>
<modules> <modules>
<module>abstract-factory</module> <module>abstract-factory</module>
<module>builder</module>
</modules> </modules>
</project> </project>