diff --git a/Creational/StaticFactory/StaticFactory.php b/Creational/StaticFactory/StaticFactory.php index e4c4f4b..237ec68 100644 --- a/Creational/StaticFactory/StaticFactory.php +++ b/Creational/StaticFactory/StaticFactory.php @@ -3,30 +3,26 @@ namespace DesignPatterns\Creational\StaticFactory; /** - * Note1: Remember, static => global => evil + * Note1: Remember, static means global state which is evil because it can't be mocked for tests * Note2: Cannot be subclassed or mock-upped or have multiple different instances. */ -class StaticFactory +final class StaticFactory { /** - * the parametrized function to get create an instance. - * * @param string $type * - * @static - * - * @throws \InvalidArgumentException - * * @return FormatterInterface */ - public static function factory($type) + public static function factory(string $type): FormatterInterface { - $className = __NAMESPACE__.'\Format'.ucfirst($type); - - if (!class_exists($className)) { - throw new \InvalidArgumentException('Missing format class.'); + if ($type == 'number') { + return new FormatNumber(); } - return new $className(); + if ($type == 'string') { + return new FormatString(); + } + + throw new \InvalidArgumentException('Unknown format given'); } } diff --git a/Creational/StaticFactory/Tests/StaticFactoryTest.php b/Creational/StaticFactory/Tests/StaticFactoryTest.php index 61f65af..cd1362d 100644 --- a/Creational/StaticFactory/Tests/StaticFactoryTest.php +++ b/Creational/StaticFactory/Tests/StaticFactoryTest.php @@ -4,33 +4,29 @@ namespace DesignPatterns\Creational\StaticFactory\Tests; use DesignPatterns\Creational\StaticFactory\StaticFactory; -/** - * Tests for Static Factory pattern. - */ class StaticFactoryTest extends \PHPUnit_Framework_TestCase { - public function getTypeList() + public function testCanCreateNumberFormatter() { - return array( - array('string'), - array('number'), + $this->assertInstanceOf( + 'DesignPatterns\Creational\StaticFactory\FormatNumber', + StaticFactory::factory('number') + ); + } + + public function testCanCreateStringFormatter() + { + $this->assertInstanceOf( + 'DesignPatterns\Creational\StaticFactory\FormatString', + StaticFactory::factory('string') ); } /** - * @dataProvider getTypeList - */ - public function testCreation($type) - { - $obj = StaticFactory::factory($type); - $this->assertInstanceOf('DesignPatterns\Creational\StaticFactory\FormatterInterface', $obj); - } - - /** - * @expectedException InvalidArgumentException + * @expectedException \InvalidArgumentException */ public function testException() { - StaticFactory::factory(''); + StaticFactory::factory('object'); } }