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. -![alt text](./etc/factory-kit_1.png "Factory Kit") +![alt text](./etc/factory-kit.png "Factory Kit") ## 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()); + } }