相比 简单工厂模式(SimpleFactory)而言,工厂方法模式(Factory Method)可以通过延伸出子类,实现用不同的方法创建对象。
对于比较简单的情况,这个抽象类可能只是一个接口。
这是一个 “真正” 的设计模式,因为它遵循了”依赖反转原则(Dependency Inversion Principle)” 。也就是 SOLID 原则中的”D”。
这意味着工厂方法实现的类依赖于类的抽象,而不是具体的类。这也是 工厂方法模式 与 简单工厂模式 和 静态工厂模式 之间最重要的区别。
Logger.php
<?php declare(strict_types=1); namespace DesignPatternsCreationalFactoryMethod; interface Logger{ public function log(string $message); }
StdoutLogger.php
<?php declare(strict_types=1); namespace DesignPatternsCreationalFactoryMethod; class StdoutLogger implements Logger{ public function log(string $message){ echo $message; } }
FileLogger.php
<?php declare(strict_types=1); namespace DesignPatternsCreationalFactoryMethod; class FileLogger implements Logger{ public function __construct(private string $filePath){ } public function log(string $message){ file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND); } }
LoggerFactory.php
<?php declare(strict_types=1); namespace DesignPatternsCreationalFactoryMethod; interface LoggerFactory{ public function createLogger(): Logger; }
StdoutLoggerFactory.php
<?php declare(strict_types=1); namespace DesignPatternsCreationalFactoryMethod; class StdoutLoggerFactory implements LoggerFactory { public function createLogger(): Logger { return new StdoutLogger(); } }
FileLoggerFactory.php
<?php declare(strict_types=1); namespace DesignPatternsCreationalFactoryMethod; class FileLoggerFactory implements LoggerFactory { public function __construct(private string $filePath) { } public function createLogger(): Logger { return new FileLogger($this->filePath); } }
Tests/FactoryMethodTest.php
<?php declare(strict_types=1); namespace DesignPatternsCreationalFactoryMethodTests; use DesignPatternsCreationalFactoryMethodFileLogger; use DesignPatternsCreationalFactoryMethodFileLoggerFactory; use DesignPatternsCreationalFactoryMethodStdoutLogger; use DesignPatternsCreationalFactoryMethodStdoutLoggerFactory; use PHPUnitFrameworkTestCase; class FactoryMethodTest extends TestCase { public function testCanCreateStdoutLogging() { $loggerFactory = new StdoutLoggerFactory(); $logger = $loggerFactory->createLogger(); $this->assertInstanceOf(StdoutLogger::class, $logger); } public function testCanCreateFileLogging() { $loggerFactory = new FileLoggerFactory(sys_get_temp_dir()); $logger = $loggerFactory->createLogger(); $this->assertInstanceOf(FileLogger::class, $logger); } }
黑盒测试,白盒测试与灰盒测试的比较和区别如下所示:编号黑盒测试白盒测试灰盒测试1不需要了解内部工作结构(代码)。测试用例只...
定位符是小型数据结构,包含用于访问LOB实际数据的信息。在数据库的表中,定位符直接存储在表中,而数据可以存储在表中或单...
可以使用 Fetch Size 更改行获取值来更改每次访问数据库游标时检索的行数。默认情况下,OceanBase Connector/J 运行查询时,默认...
OceanBase Connector/J 支持登录认证和 SSL 安全功能。登录认证客户端身份验证服务支持添加新的客户端身份验证插件。Java 连接器...