与 抽象工厂 类似,静态工厂模式用于创建一系列互相关联或依赖的对象。它与抽象工厂模式的区别在于,静态工厂模式仅使用 一个静态方法 来创建所有它可以创建的类型。通常,这个静态方法被命名为:factory 或 build。
StaticFactory.php
<?php
declare(strict_types=1);
namespace DesignPatternsCreationalStaticFactory;
use InvalidArgumentException;
final class StaticFactory
{
public static function factory(string $type): Formatter
{
if ($type == "number") {
return new FormatNumber();
} elseif ($type == "string") {
return new FormatString();
}
throw new InvalidArgumentException("Unknown format given");
}
}
Formatter.php
<?php
declare(strict_types=1);
namespace DesignPatternsCreationalStaticFactory;
interface Formatter
{
public function format(string $input): string;
}
FormatString.php
<?php
declare(strict_types=1);
namespace DesignPatternsCreationalStaticFactory;
class FormatString implements Formatter
{
public function format(string $input): string
{
return $input;
}
}
FormatNumber.php
<?php
declare(strict_types=1);
namespace DesignPatternsCreationalStaticFactory;
class FormatNumber implements Formatter
{
public function format(string $input): string
{
return number_format((int) $input);
}
}
Tests/StaticFactoryTest.php
<?php
declare(strict_types=1);
namespace DesignPatternsCreationalStaticFactoryTests;
use InvalidArgumentException;
use DesignPatternsCreationalStaticFactoryFormatNumber;
use DesignPatternsCreationalStaticFactoryFormatString;
use DesignPatternsCreationalStaticFactoryStaticFactory;
use PHPUnitFrameworkTestCase;
class StaticFactoryTest extends TestCase
{
public function testCanCreateNumberFormatter()
{
$this->assertInstanceOf(FormatNumber::class, StaticFactory::factory("number"));
}
public function testCanCreateStringFormatter()
{
$this->assertInstanceOf(FormatString::class, StaticFactory::factory("string"));
}
public function testException()
{
$this->expectException(InvalidArgumentException::class);
StaticFactory::factory("object");
}
}
集成测试是单元测试后软件测试过程的第二个层次。在此测试中,软件的单元或单个组件在组中进行测试。集成测试级别的重点是在集成...
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表...
在本章中,我们将研究软件视线中的编程方法、文档和挑战。结构化编程在编码过程中,代码行数不断增加,从而使软件的体积增大。渐...
OceanBase Connector/J 支持处理 PL 存储过程和匿名块,支持 PL 块语法和大多数 JDBC 转义语法。以下 PL 调用可与 OceanBase Con...