PHP 抽象工廠模式

2022-05-05 11:23 更新

目的

創(chuàng)建一系列互相關(guān)聯(lián)或依賴的對象時,不指定他們具體的類。因為這些創(chuàng)建的類通常都實現(xiàn)了同一個接口。抽象工廠的客戶端并不關(guān)心對象是如何創(chuàng)建的,而只知道它們是怎樣組合的。

UML 圖

Alt AbstractFactory UML Diagram

代碼

WriterFactory.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

interface WriterFactory{
    public function createCsvWriter(): CsvWriter;
    public function createJsonWriter(): JsonWriter;
}

CsvWriter.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

interface CsvWriter{
    public function write(array $line): string;
}

JsonWriter.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

interface JsonWriter{
    public function write(array $data, bool $formatted): string;
}

UnixCsvWriter.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

class UnixCsvWriter implements CsvWriter{
    public function write(array $line): string{
        return join(',', $line) . "\n";
    }
}

UnixJsonWriter.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

class UnixJsonWriter implements JsonWriter{
    public function write(array $data, bool $formatted): string{
        $options = 0;
        if ($formatted) {
            $options = JSON_PRETTY_PRINT;
        }
        return json_encode($data, $options);
    }
}

UnixWriterFactory.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

class UnixWriterFactory implements WriterFactory{
    public function createCsvWriter(): CsvWriter{
        return new UnixCsvWriter();
    }
    public function createJsonWriter(): JsonWriter{
        return new UnixJsonWriter();
    }
}

WinCsvWriter.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

class WinCsvWriter implements CsvWriter{
    public function write(array $line): string{
        return join(',', $line) . "\r\n";
    }
}

WinJsonWriter.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

class WinJsonWriter implements JsonWriter{
    public function write(array $data, bool $formatted): string{
        return json_encode($data, JSON_PRETTY_PRINT);
    }
}

WinWriterFactory.php

<?php
namespace DesignPatterns\Creational\AbstractFactory;

class WinWriterFactory implements WriterFactory{
    public function createCsvWriter(): CsvWriter{
        return new WinCsvWriter();
    }
    public function createJsonWriter(): JsonWriter{
        return new WinJsonWriter();
    }
}

測試

Tests/AbstractFactoryTest.php

<?php
declare(strict_types=1);

namespace DesignPatterns\Creational\AbstractFactory\Tests;

use DesignPatterns\Creational\AbstractFactory\CsvWriter;
use DesignPatterns\Creational\AbstractFactory\JsonWriter;
use DesignPatterns\Creational\AbstractFactory\UnixWriterFactory;
use DesignPatterns\Creational\AbstractFactory\WinWriterFactory;
use DesignPatterns\Creational\AbstractFactory\WriterFactory;
use PHPUnit\Framework\TestCase;

class AbstractFactoryTest extends TestCase{
    public function provideFactory(){
        return [
            [new UnixWriterFactory()],
            [new WinWriterFactory()]
        ];
    }

    /**
     * @dataProvider provideFactory
     */
    public function testCanCreateCsvWriterOnUnix(WriterFactory $writerFactory){
        $this->assertInstanceOf(JsonWriter::class, $writerFactory->createJsonWriter());
        $this->assertInstanceOf(CsvWriter::class, $writerFactory->createCsvWriter());
    }
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號