From 022ab28e20dd3cea96381ad5adacd443ea1e7e1b Mon Sep 17 00:00:00 2001 From: Crossy147 Date: Mon, 15 Feb 2016 20:37:16 +0100 Subject: [PATCH] issue #333 diagrams and index added --- factory-kit/etc/factory-kit.png | Bin 0 -> 37570 bytes factory-kit/etc/factory-kit.ucls | 10 ++ factory-kit/index.md | 11 +- .../java/com/iluwatar/factorykit/App.java | 20 ++-- .../java/com/iluwatar/factorykit/Axe.java | 7 +- .../java/com/iluwatar/factorykit/Bow.java | 7 +- .../java/com/iluwatar/factorykit/Builder.java | 5 +- .../java/com/iluwatar/factorykit/Spear.java | 7 +- .../java/com/iluwatar/factorykit/Sword.java | 7 +- .../java/com/iluwatar/factorykit/Weapon.java | 3 + .../iluwatar/factorykit/WeaponFactory.java | 17 +-- .../com/iluwatar/factorykit/WeaponType.java | 5 +- .../com/iluwatar/factorykit/app/AppTest.java | 9 +- .../factorykit/factorykit/FactoryKitTest.java | 83 +++++++------- .../factory/method/FactoryMethodTest.java | 102 +++++++++--------- 15 files changed, 159 insertions(+), 134 deletions(-) create mode 100644 factory-kit/etc/factory-kit.png create mode 100644 factory-kit/etc/factory-kit.ucls diff --git a/factory-kit/etc/factory-kit.png b/factory-kit/etc/factory-kit.png new file mode 100644 index 0000000000000000000000000000000000000000..7093193cb8d0256d1b6bad2434363135cb58710d GIT binary patch literal 37570 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 a(XB + + + + + + + \ 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()); + } }