跳转至

抽象工厂模式(Abstract Factory)#

1. 目的#

在不指定具体类的情况下创建一系列相关或依赖对象。 通常创建的类都实现相同的接口。 抽象工厂的客户并不关心这些对象是如何创建的,它只是知道它们是如何一起运行的。

2. UML 图#

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
{
    // 你的逻辑代码
}

4. 测试#

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

原文:


最后更新: 2018年8月4日 13:04:18