静态工厂模式(Static Factory)
1.9.1. 目的
与抽象工厂模式类似,此模式用于创建一系列相关或相互依赖的对象。 『静态工厂模式』与『抽象工厂模式』的区别在于,只使用一个静态方法来创建所有类型对象, 此方法通常被命名为 factory
或 build
。
1.9.2. 例子
- Zend Framework:
Zend_Cache_Backend
或_Frontend
使用工厂方法创建缓存后端或前端
1.9.3. UML 图
1.9.4. 代码
你可以在 GitHub 上找到这个代码。
StaticFactory.php
<?php
namespace DesignPatterns\Creational\StaticFactory;
/**
* 注意点1: 记住,静态意味着全局状态,因为它不能被模拟进行测试,所以它是有弊端的
* 注意点2: 不能被分类或模拟或有多个不同的实例。
*/
final class StaticFactory
{
/**
* @param string $type
*
* @return FormatterInterface
*/
public static function factory(string $type): FormatterInterface
{
if ($type == 'number') {
return new FormatNumber();
}
if ($type == 'string') {
return new FormatString();
}
throw new \InvalidArgumentException('Unknown format given');
}
}
FormatterInterface.php
<?php
namespace DesignPatterns\Creational\StaticFactory;
interface FormatterInterface
{
}
FormatString.php
<?php
namespace DesignPatterns\Creational\StaticFactory;
class FormatString implements FormatterInterface
{
}
FormatNumber.php
<?php
namespace DesignPatterns\Creational\StaticFactory;
class FormatNumber implements FormatterInterface
{
}
1.9.5. 测试
Tests/StaticFactoryTest.php
<?php
namespace DesignPatterns\Creational\StaticFactory\Tests;
use DesignPatterns\Creational\StaticFactory\StaticFactory;
use PHPUnit\Framework\TestCase;
class StaticFactoryTest extends TestCase
{
public function testCanCreateNumberFormatter()
{
$this->assertInstanceOf(
'DesignPatterns\Creational\StaticFactory\FormatNumber',
StaticFactory::factory('number')
);
}
public function testCanCreateStringFormatter()
{
$this->assertInstanceOf(
'DesignPatterns\Creational\StaticFactory\FormatString',
StaticFactory::factory('string')
);
}
/**
* @expectedException \InvalidArgumentException
*/
public function testException()
{
StaticFactory::factory('object');
}
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: