静态工厂模式(Static Factory)与简单工厂类似,该模式用于创建一组相关或依赖的对象,不同之处在于静态工厂模式使用一个静态方法来创建所有类型的对象,该静态方法通常是 factory 或 build。
【一】模式定义
与简单工厂类似,该模式用于创建一组相关或依赖的对象,不同之处在于静态工厂模式使用一个静态方法来创建所有类型的对象,该静态方法通常是 factory 或 build。
【二】UML类图

【三】示例代码
StaticFactory.php
<?php
namespace DesignPatterns\Creational\StaticFactory;
class StaticFactory
{
    /**
     * 通过传入参数创建相应对象实例
     *
     * @param string $type
     *
     * @static
     *
     * @throws \InvalidArgumentException
     * @return FormatterInterface
     */
    public static function factory($type)
    {
        $className = __NAMESPACE__ . '\Format' . ucfirst($type);
        if (!class_exists($className)) {
            throw new \InvalidArgumentException('Missing format class.');
        }
        return new $className();
    }
}
FormatterInterface.php
<?php
namespace DesignPatterns\Creational\StaticFactory;
/**
 * FormatterInterface接口
 */
interface FormatterInterface
{
}
FormatString.php
<?php
namespace DesignPatterns\Creational\StaticFactory;
/**
 * FormatNumber类
 */
class FormatNumber implements FormatterInterface
{
}
【四】测试代码
Tests/StaticFactoryTest.php
<?php
namespace DesignPatterns\Creational\StaticFactory\Tests;
use DesignPatterns\Creational\StaticFactory\StaticFactory;
/**
 * 测试静态工厂模式
 *
 */
class StaticFactoryTest extends \PHPUnit_Framework_TestCase
{
    public function getTypeList()
    {
        return array(
            array('string'),
            array('number')
        );
    }
    /**
     * @dataProvider getTypeList
     */
    public function testCreation($type)
    {
        $obj = StaticFactory::factory($type);
        $this->assertInstanceOf('DesignPatterns\Creational\StaticFactory\FormatterInterface', $obj);
    }
    /**
     * @expectedException InvalidArgumentException
     */
    public function testException()
    {
        StaticFactory::factory("");
    }
}
登录后可发表评论