issue #333 diagrams and index added

This commit is contained in:
Crossy147
2016-02-15 20:37:16 +01:00
parent 10bbf988ea
commit 022ab28e20
15 changed files with 159 additions and 134 deletions

View File

@ -2,14 +2,14 @@ package com.iluwatar.factorykit;
public class App {
public static void main(String[] args) {
WeaponFactory factory = WeaponFactory.factory(builder -> {
builder.add(WeaponType.SWORD, Sword::new);
builder.add(WeaponType.AXE, Axe::new);
builder.add(WeaponType.SPEAR, Spear::new);
builder.add(WeaponType.BOW, Bow::new);
});
Weapon axe = factory.create(WeaponType.AXE);
System.out.println(axe);
}
public static void main(String[] args) {
WeaponFactory factory = WeaponFactory.factory(builder -> {
builder.add(WeaponType.SWORD, Sword::new);
builder.add(WeaponType.AXE, Axe::new);
builder.add(WeaponType.SPEAR, Spear::new);
builder.add(WeaponType.BOW, Bow::new);
});
Weapon axe = factory.create(WeaponType.AXE);
System.out.println(axe);
}
}

View File

@ -1,7 +1,8 @@
package com.iluwatar.factorykit;
public class Axe implements Weapon {
@Override public String toString() {
return "Axe{}";
}
@Override
public String toString() {
return "Axe";
}
}

View File

@ -1,7 +1,8 @@
package com.iluwatar.factorykit;
/**
* Created by crossy on 2016-01-16.
*/
public class Bow implements Weapon {
@Override
public String toString() {
return "Bow";
}
}

View File

@ -2,6 +2,9 @@ package com.iluwatar.factorykit;
import java.util.function.Supplier;
/**
* Functional interface that allows adding builder with name to the factory
*/
public interface Builder {
void add(WeaponType name, Supplier<Weapon> supplier);
void add(WeaponType name, Supplier<Weapon> supplier);
}

View File

@ -1,7 +1,8 @@
package com.iluwatar.factorykit;
public class Spear implements Weapon {
@Override public String toString() {
return "Spear{}";
}
@Override
public String toString() {
return "Spear";
}
}

View File

@ -1,7 +1,8 @@
package com.iluwatar.factorykit;
public class Sword implements Weapon {
@Override public String toString() {
return "Sword{}";
}
@Override
public String toString() {
return "Sword";
}
}

View File

@ -1,4 +1,7 @@
package com.iluwatar.factorykit;
/**
* Interface representing weapon
*/
public interface Weapon {
}

View File

@ -4,13 +4,18 @@ import java.util.HashMap;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* Functional interface that represents factory kit. Instance created locally gives an opportunity to strictly define
* which objects types the instance of a factory would be able to create. Factory is just a placeholder for builders with
* create method to initialize new objects.
*/
public interface WeaponFactory {
Weapon create(WeaponType name);
Weapon create(WeaponType name);
static WeaponFactory factory(Consumer<Builder> consumer) {
HashMap<WeaponType, Supplier<Weapon>> map = new HashMap<>();
consumer.accept(map::put);
return name -> map.get(name).get();
}
static WeaponFactory factory(Consumer<Builder> consumer) {
HashMap<WeaponType, Supplier<Weapon>> map = new HashMap<>();
consumer.accept(map::put);
return name -> map.get(name).get();
}
}

View File

@ -1,8 +1,5 @@
package com.iluwatar.factorykit;
/**
* Created by crossy on 2016-01-16.
*/
public enum WeaponType {
SWORD, AXE, BOW, SPEAR
SWORD, AXE, BOW, SPEAR
}

View File

@ -5,9 +5,10 @@ import org.junit.Test;
public class AppTest {
@Test public void test() {
String[] args = {};
App.main(args);
}
@Test
public void test() {
String[] args = {};
App.main(args);
}
}

View File

@ -6,53 +6,54 @@ import org.junit.Test;
import static org.junit.Assert.assertTrue;
/**
* Created by crossy on 2016-01-16.
*/
public class FactoryKitTest {
private WeaponFactory factory;
private WeaponFactory factory;
@Before public void init() {
factory = WeaponFactory.factory(builder -> {
builder.add(WeaponType.SPEAR, Spear::new);
builder.add(WeaponType.AXE, Axe::new);
builder.add(WeaponType.SWORD, Sword::new);
});
}
@Before
public void init() {
factory = WeaponFactory.factory(builder -> {
builder.add(WeaponType.SPEAR, Spear::new);
builder.add(WeaponType.AXE, Axe::new);
builder.add(WeaponType.SWORD, Sword::new);
});
}
/**
* Testing {@link WeaponFactory} to produce a SPEAR asserting that the Weapon is an instance of {@link Spear}
*/
@Test public void testSpearWeapon() {
Weapon weapon = factory.create(WeaponType.SPEAR);
verifyWeapon(weapon, Spear.class);
}
/**
* Testing {@link WeaponFactory} to produce a SPEAR asserting that the Weapon is an instance of {@link Spear}
*/
@Test
public void testSpearWeapon() {
Weapon weapon = factory.create(WeaponType.SPEAR);
verifyWeapon(weapon, Spear.class);
}
/**
* Testing {@link WeaponFactory} to produce a AXE asserting that the Weapon is an instance of {@link Axe}
*/
@Test public void testAxeWeapon() {
Weapon weapon = factory.create(WeaponType.AXE);
verifyWeapon(weapon, Axe.class);
}
/**
* Testing {@link WeaponFactory} to produce a AXE asserting that the Weapon is an instance of {@link Axe}
*/
@Test
public void testAxeWeapon() {
Weapon weapon = factory.create(WeaponType.AXE);
verifyWeapon(weapon, Axe.class);
}
/**
* Testing {@link WeaponFactory} to produce a SWORD asserting that the Weapon is an instance of {@link Sword}
*/
@Test public void testWeapon() {
Weapon weapon = factory.create(WeaponType.SWORD);
verifyWeapon(weapon, Sword.class);
}
/**
* Testing {@link WeaponFactory} to produce a SWORD asserting that the Weapon is an instance of {@link Sword}
*/
@Test
public void testWeapon() {
Weapon weapon = factory.create(WeaponType.SWORD);
verifyWeapon(weapon, Sword.class);
}
/**
* This method asserts that the weapon object that is passed is an instance of the clazz
*
* @param weapon weapon object which is to be verified
* @param clazz expected class of the weapon
*/
private void verifyWeapon(Weapon weapon, Class clazz) {
assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon));
}
/**
* This method asserts that the weapon object that is passed is an instance of the clazz
*
* @param weapon weapon object which is to be verified
* @param clazz expected class of the weapon
*/
private void verifyWeapon(Weapon weapon, Class clazz) {
assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon));
}
}