🏭

PHPでデザインパターン「Factory Method」

2023/08/23に公開

目次

  1. 概要
  2. 実装
  3. 資料

概要

Factory Methodパターンはその名の通りインスタンス生成の工場となるパターンです。
コードの中でインスタンスの生成とロジックが混ざることは複雑さに繋がるため、「インスタンス生成」と「ロジック」のコードを分けることが出来るFactory Methodパターンが有効です。

実装

<?php
// 商品
interface Item
{
    public function getName(): string;
    public function getPrice(): int;
}

// 税込み商品
class TaxIncludedItem implements Item
{
    public function __construct(
        private string $name,
        private int $price,
        private float $taxRate,
    ) {}

    public function getName(): string
    {
        return $this->name;
    }

    public function getPrice(): int
    {
        $value = $this->price * $this->taxRate;
        return (int)$value;
    }
}
<?php
// 税込み商品のインスタンスを生成する工場
class TaxIncludedItemFactory
{
    public function create(string $name, int $price, float $taxRate): Item
    {
        return $this->createItem($name, $price, $taxRate);
    }

    private function createItem(string $name, int $price, float $taxRate): Item
    {
        return new TaxIncludedItem($name, $price, $taxRate);
    }
}
<?php

use PHPUnit\Framework\TestCase;

// テストコード
class TaxIncludedItemFactoryTest extends TestCase
{
    public function test_tax_included_item_factory(): void
    {
        $factory = new TaxIncludedItemFactory();
        $item = $factory->create("ペン", 100, 1.1);
        $this->assertSame("ペン", $item->getName());
        $this->assertSame(110, $item->getPrice());
    }
}

資料

参考文献『PHPによるデザインパターン入門』https://shimooka.hateblo.jp/entry/20100301/1267436385
https://github.com/naoyuki42/php-design-pattern

Discussion