W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
相比 簡單工廠模式(SimpleFactory)而言,工廠方法模式(Factory Method)可以通過延伸出子類,實現(xiàn)用不同的方法創(chuàng)建對象。
對于比較簡單的情況,這個抽象類可能只是一個接口。
這是一個 “真正” 的設計模式,因為它遵循了”依賴反轉原則(Dependency Inversion Principle)” 。也就是 SOLID 原則中的”D”。
這意味著工廠方法實現(xiàn)的類依賴于類的抽象,而不是具體的類。這也是 工廠方法模式 與 簡單工廠模式 和 靜態(tài)工廠模式 之間最重要的區(qū)別。
Logger.php
<?php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; interface Logger{ public function log(string $message); }
StdoutLogger.php
<?php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; class StdoutLogger implements Logger{ public function log(string $message){ echo $message; } }
FileLogger.php
<?php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; 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 DesignPatterns\Creational\FactoryMethod; interface LoggerFactory{ public function createLogger(): Logger; }
StdoutLoggerFactory.php
<?php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; class StdoutLoggerFactory implements LoggerFactory { public function createLogger(): Logger { return new StdoutLogger(); } }
FileLoggerFactory.php
<?php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; 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 DesignPatterns\Creational\FactoryMethod\Tests; use DesignPatterns\Creational\FactoryMethod\FileLogger; use DesignPatterns\Creational\FactoryMethod\FileLoggerFactory; use DesignPatterns\Creational\FactoryMethod\StdoutLogger; use DesignPatterns\Creational\FactoryMethod\StdoutLoggerFactory; use PHPUnit\Framework\TestCase; 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); } }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: