1. 程式人生 > >抽象工廠模式(Abstract Factory)

抽象工廠模式(Abstract Factory)

1.1.1. 目的

在不指定具體類的情況下建立一系列相關或依賴物件。 通常建立的類都實現相同的介面。 抽象工廠的客戶並不關心這些物件是如何建立的,它只是知道它們是如何一起執行的。

1.1.2. UML 圖

file

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);
    }
}