抽象工廠模式(Abstract Factory)
阿新 • • 發佈:2019-01-22
1.1.1. 目的
在不指定具體類的情況下建立一系列相關或依賴物件。 通常建立的類都實現相同的介面。 抽象工廠的客戶並不關心這些物件是如何建立的,它只是知道它們是如何一起執行的。
1.1.2. UML 圖
1.1.3. 程式碼
你可以在 GitHub 上找到這個程式碼。
AbstractFactory.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
/**
* 在這種情況下,抽象工廠是建立一些元件的契約
* 在 Web 中。 有兩種呈現文字的方式:HTML 和 JSON
*/
abstract class AbstractFactory
{
abstract public function createText(string $content): Text;
}
JsonFactory.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class JsonFactory extends AbstractFactory
{
public function createText(string $content): Text
{
return new JsonText($content);
}
}
HtmlFactory.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class HtmlFactory extends AbstractFactory
{
public function createText(string $content): Text
{
return new HtmlText($content);
}
}
Text.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
abstract class Text
{
/**
* @var string
*/
private $text;
public function __construct(string $text)
{
$this->text = $text;
}
}
JsonText.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class JsonText extends Text
{
// 你的邏輯程式碼
}
HtmlText.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class HtmlText extends Text
{
// 你的邏輯程式碼
}
1.1.4. Test
Tests/AbstractFactoryTest.php
<?php
namespace DesignPatterns\Creational\AbstractFactory\Tests;
use DesignPatterns\Creational\AbstractFactory\HtmlFactory;
use DesignPatterns\Creational\AbstractFactory\HtmlText;
use DesignPatterns\Creational\AbstractFactory\JsonFactory;
use DesignPatterns\Creational\AbstractFactory\JsonText;
use PHPUnit\Framework\TestCase;
class AbstractFactoryTest extends TestCase
{
public function testCanCreateHtmlText()
{
$factory = new HtmlFactory();
$text = $factory->createText('foobar');
$this->assertInstanceOf(HtmlText::class, $text);
}
public function testCanCreateJsonText()
{
$factory = new JsonFactory();
$text = $factory->createText('foobar');
$this->assertInstanceOf(JsonText::class, $text);
}
}