mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-05-15 03:01:12 +00:00
#111 Implementation of Step Builder pattern
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
package com.iluwatar.stepbuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* The Step Builder class.
|
||||
*/
|
||||
|
||||
public class CharacterStepBuilder {
|
||||
|
||||
private CharacterStepBuilder() {
|
||||
}
|
||||
|
||||
public static NameStep newBuilder() {
|
||||
return new CharacterSteps();
|
||||
}
|
||||
|
||||
/**
|
||||
* First Builder Step in charge of the Character name.
|
||||
* Next Step available : ClassStep
|
||||
*/
|
||||
public interface NameStep {
|
||||
ClassStep name(String name);
|
||||
}
|
||||
|
||||
/**
|
||||
* This step is in charge of setting the Character class (fighter or wizard).
|
||||
* Fighter choice : Next Step available : WeaponStep
|
||||
* Wizard choice : Next Step available : SpellStep
|
||||
*/
|
||||
public interface ClassStep {
|
||||
WeaponStep fighterClass(String fighterClass);
|
||||
SpellStep wizardClass(String wizardClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* This step is in charge of the weapon.
|
||||
* Weapon choice : Next Step available : AbilityStep
|
||||
* No weapon choice : Next Step available : BuildStep
|
||||
*/
|
||||
public interface WeaponStep {
|
||||
AbilityStep withWeapon(String weapon);
|
||||
BuildStep noWeapon();
|
||||
}
|
||||
|
||||
/**
|
||||
* This step is in charge of the spell.
|
||||
* Spell choice : Next Step available : AbilityStep
|
||||
* No spell choice : Next Step available : BuildStep
|
||||
*/
|
||||
public interface SpellStep {
|
||||
AbilityStep withSpell(String spell);
|
||||
BuildStep noSpell();
|
||||
}
|
||||
|
||||
/**
|
||||
* This step is in charge of abilities.
|
||||
* Next Step available : BuildStep
|
||||
*/
|
||||
public interface AbilityStep {
|
||||
AbilityStep withAbility(String ability);
|
||||
BuildStep noMoreAbilities();
|
||||
BuildStep noAbilities();
|
||||
}
|
||||
|
||||
/**
|
||||
* This is the final step in charge of building the Character Object.
|
||||
* Validation should be here.
|
||||
*/
|
||||
public interface BuildStep {
|
||||
Character build();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Step Builder implementation.
|
||||
*/
|
||||
private static class CharacterSteps
|
||||
implements NameStep, ClassStep, WeaponStep, SpellStep, AbilityStep, BuildStep {
|
||||
|
||||
private String name;
|
||||
private String fighterClass;
|
||||
private String wizardClass;
|
||||
private String weapon;
|
||||
private String spell;
|
||||
private List<String> abilities = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public ClassStep name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WeaponStep fighterClass(String fighterClass) {
|
||||
this.fighterClass = fighterClass;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SpellStep wizardClass(String wizardClass) {
|
||||
this.wizardClass = wizardClass;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbilityStep withWeapon(String weapon) {
|
||||
this.weapon = weapon;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BuildStep noWeapon() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbilityStep withSpell(String spell) {
|
||||
this.spell = spell;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BuildStep noSpell() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbilityStep withAbility(String ability) {
|
||||
this.abilities.add(ability);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BuildStep noMoreAbilities() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BuildStep noAbilities() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Character build() {
|
||||
Character character = new Character(name);
|
||||
|
||||
if (fighterClass != null) {
|
||||
character.setFighterClass(fighterClass);
|
||||
} else {
|
||||
character.setWizardClass(wizardClass);
|
||||
}
|
||||
|
||||
if (weapon != null) {
|
||||
character.setWeapon(weapon);
|
||||
} else {
|
||||
character.setSpell(spell);
|
||||
}
|
||||
|
||||
if (!abilities.isEmpty()) {
|
||||
character.setAbilities(abilities);
|
||||
}
|
||||
|
||||
return character;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user