diff --git a/factory-kit/etc/factory-kit.png b/factory-kit/etc/factory-kit.png
new file mode 100644
index 000000000..7093193cb
Binary files /dev/null and b/factory-kit/etc/factory-kit.png differ
diff --git a/factory-kit/etc/factory-kit.ucls b/factory-kit/etc/factory-kit.ucls
new file mode 100644
index 000000000..403fb7e27
--- /dev/null
+++ b/factory-kit/etc/factory-kit.ucls
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/factory-kit/index.md b/factory-kit/index.md
index 63809ecc3..03fa53de0 100644
--- a/factory-kit/index.md
+++ b/factory-kit/index.md
@@ -10,21 +10,18 @@ tags:
- Functional
---
-## Also known as
-Virtual Constructor
-
## Intent
Define factory of immutable content with separated builder and factory interfaces.
-
+
## Applicability
Use the Factory Kit pattern when
* a class can't anticipate the class of objects it must create
-* you just want a new instance of custom builder instead of global one
-* a class wants its subclasses to specify the objects it creates
-* classes delegate responsibility to one of several helper subclasses, and you want to localize the knowledge of which helper subclass is the delegate
+* you just want a new instance of a custom builder instead of the global one
+* you explicitly want to define types of objects, that factory can build
+* you want a separated builder and creator interface
## Credits
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/App.java b/factory-kit/src/main/java/com/iluwatar/factorykit/App.java
index 572b24630..659cc4a33 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/App.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/App.java
@@ -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);
+ }
}
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/Axe.java b/factory-kit/src/main/java/com/iluwatar/factorykit/Axe.java
index 8a3ca587b..4e1a5e554 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/Axe.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/Axe.java
@@ -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";
+ }
}
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/Bow.java b/factory-kit/src/main/java/com/iluwatar/factorykit/Bow.java
index aac272513..a90f4cf2e 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/Bow.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/Bow.java
@@ -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";
+ }
}
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/Builder.java b/factory-kit/src/main/java/com/iluwatar/factorykit/Builder.java
index e20795a1f..2612fe1e6 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/Builder.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/Builder.java
@@ -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 supplier);
+ void add(WeaponType name, Supplier supplier);
}
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/Spear.java b/factory-kit/src/main/java/com/iluwatar/factorykit/Spear.java
index 9bbb41915..a50f54290 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/Spear.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/Spear.java
@@ -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";
+ }
}
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/Sword.java b/factory-kit/src/main/java/com/iluwatar/factorykit/Sword.java
index f6e5c5a3e..278febaf5 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/Sword.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/Sword.java
@@ -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";
+ }
}
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/Weapon.java b/factory-kit/src/main/java/com/iluwatar/factorykit/Weapon.java
index 039628f3d..4e9daee55 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/Weapon.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/Weapon.java
@@ -1,4 +1,7 @@
package com.iluwatar.factorykit;
+/**
+ * Interface representing weapon
+ */
public interface Weapon {
}
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/WeaponFactory.java b/factory-kit/src/main/java/com/iluwatar/factorykit/WeaponFactory.java
index e77e2023b..df29e6284 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/WeaponFactory.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/WeaponFactory.java
@@ -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 consumer) {
- HashMap> map = new HashMap<>();
- consumer.accept(map::put);
- return name -> map.get(name).get();
- }
+ static WeaponFactory factory(Consumer consumer) {
+ HashMap> map = new HashMap<>();
+ consumer.accept(map::put);
+ return name -> map.get(name).get();
+ }
}
diff --git a/factory-kit/src/main/java/com/iluwatar/factorykit/WeaponType.java b/factory-kit/src/main/java/com/iluwatar/factorykit/WeaponType.java
index 1db668b0e..89a17523a 100644
--- a/factory-kit/src/main/java/com/iluwatar/factorykit/WeaponType.java
+++ b/factory-kit/src/main/java/com/iluwatar/factorykit/WeaponType.java
@@ -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
}
diff --git a/factory-kit/src/test/java/com/iluwatar/factorykit/app/AppTest.java b/factory-kit/src/test/java/com/iluwatar/factorykit/app/AppTest.java
index 9dbb8444e..9b9af2530 100644
--- a/factory-kit/src/test/java/com/iluwatar/factorykit/app/AppTest.java
+++ b/factory-kit/src/test/java/com/iluwatar/factorykit/app/AppTest.java
@@ -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);
+ }
}
diff --git a/factory-kit/src/test/java/com/iluwatar/factorykit/factorykit/FactoryKitTest.java b/factory-kit/src/test/java/com/iluwatar/factorykit/factorykit/FactoryKitTest.java
index 088b54ba9..ea629f57d 100644
--- a/factory-kit/src/test/java/com/iluwatar/factorykit/factorykit/FactoryKitTest.java
+++ b/factory-kit/src/test/java/com/iluwatar/factorykit/factorykit/FactoryKitTest.java
@@ -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));
+ }
}
diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java
index 6a9b03d2e..2ef0de990 100644
--- a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java
+++ b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java
@@ -19,57 +19,61 @@ import static org.junit.Assert.assertTrue;
*/
public class FactoryMethodTest {
- /**
- * Testing {@link OrcBlacksmith} to produce a SPEAR asserting that the Weapon is an instance
- * of {@link OrcWeapon}.
- */
- @Test public void testOrcBlacksmithWithSpear() {
- Blacksmith blacksmith = new OrcBlacksmith();
- Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
- verifyWeapon(weapon, WeaponType.SPEAR, OrcWeapon.class);
- }
+ /**
+ * Testing {@link OrcBlacksmith} to produce a SPEAR asserting that the Weapon is an instance
+ * of {@link OrcWeapon}.
+ */
+ @Test
+ public void testOrcBlacksmithWithSpear() {
+ Blacksmith blacksmith = new OrcBlacksmith();
+ Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
+ verifyWeapon(weapon, WeaponType.SPEAR, OrcWeapon.class);
+ }
- /**
- * Testing {@link OrcBlacksmith} to produce a AXE asserting that the Weapon is an instance
- * of {@link OrcWeapon}.
- */
- @Test public void testOrcBlacksmithWithAxe() {
- Blacksmith blacksmith = new OrcBlacksmith();
- Weapon weapon = blacksmith.manufactureWeapon(WeaponType.AXE);
- verifyWeapon(weapon, WeaponType.AXE, OrcWeapon.class);
- }
+ /**
+ * Testing {@link OrcBlacksmith} to produce a AXE asserting that the Weapon is an instance
+ * of {@link OrcWeapon}.
+ */
+ @Test
+ public void testOrcBlacksmithWithAxe() {
+ Blacksmith blacksmith = new OrcBlacksmith();
+ Weapon weapon = blacksmith.manufactureWeapon(WeaponType.AXE);
+ verifyWeapon(weapon, WeaponType.AXE, OrcWeapon.class);
+ }
- /**
- * Testing {@link ElfBlacksmith} to produce a SHORT_SWORD asserting that the Weapon is an
- * instance of {@link ElfWeapon}.
- */
- @Test public void testElfBlacksmithWithShortSword() {
- Blacksmith blacksmith = new ElfBlacksmith();
- Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SHORT_SWORD);
- verifyWeapon(weapon, WeaponType.SHORT_SWORD, ElfWeapon.class);
- }
+ /**
+ * Testing {@link ElfBlacksmith} to produce a SHORT_SWORD asserting that the Weapon is an
+ * instance of {@link ElfWeapon}.
+ */
+ @Test
+ public void testElfBlacksmithWithShortSword() {
+ Blacksmith blacksmith = new ElfBlacksmith();
+ Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SHORT_SWORD);
+ verifyWeapon(weapon, WeaponType.SHORT_SWORD, ElfWeapon.class);
+ }
- /**
- * Testing {@link ElfBlacksmith} to produce a SPEAR asserting that the Weapon is an instance
- * of {@link ElfWeapon}.
- */
- @Test public void testElfBlacksmithWithSpear() {
- Blacksmith blacksmith = new ElfBlacksmith();
- Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
- verifyWeapon(weapon, WeaponType.SPEAR, ElfWeapon.class);
- }
+ /**
+ * Testing {@link ElfBlacksmith} to produce a SPEAR asserting that the Weapon is an instance
+ * of {@link ElfWeapon}.
+ */
+ @Test
+ public void testElfBlacksmithWithSpear() {
+ Blacksmith blacksmith = new ElfBlacksmith();
+ Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
+ verifyWeapon(weapon, WeaponType.SPEAR, ElfWeapon.class);
+ }
- /**
- * This method asserts that the weapon object that is passed is an instance of the clazz and the
- * weapon is of type expectedWeaponType.
- *
- * @param weapon weapon object which is to be verified
- * @param expectedWeaponType expected WeaponType of the weapon
- * @param clazz expected class of the weapon
- */
- private void verifyWeapon(Weapon weapon, WeaponType expectedWeaponType, Class clazz) {
- assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon));
- assertEquals("Weapon must be of weaponType: " + clazz.getName(), expectedWeaponType,
- weapon.getWeaponType());
- }
+ /**
+ * This method asserts that the weapon object that is passed is an instance of the clazz and the
+ * weapon is of type expectedWeaponType.
+ *
+ * @param weapon weapon object which is to be verified
+ * @param expectedWeaponType expected WeaponType of the weapon
+ * @param clazz expected class of the weapon
+ */
+ private void verifyWeapon(Weapon weapon, WeaponType expectedWeaponType, Class clazz) {
+ assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon));
+ assertEquals("Weapon must be of weaponType: " + clazz.getName(), expectedWeaponType,
+ weapon.getWeaponType());
+ }
}