以下のサンプルはファクトリーメソッドパターンの実装例です。
ファクトリーメソッドパターンは、ファクトリークラスを抽象化し、各飲料クラス専用の生成機能として使用します。
このアプローチにより、凝集度を高め、新しい飲料の追加や変更が容易になります。
しかし、単純ファクトリーパターンにある一つのファクトリーから選択的にオブジェクトを生成する機能は失われました。
この点は、システム要件に応じて検討すべき重要な要因です。
ファクトリーパターンの選択に際して、各パターンの特徴と利点をよく理解し、設計ニーズに合致するものを選択する必要があります。
<?php
/**
* 飲料インターフェイス
*/
interface Drink
{
public function getName(): string;
}
<?php
/**
* 飲料ファクトリークラス
*/
abstract class DrinkFactory
{
abstract public function createDrink(): Drink;
}
<?php
/**
* コーラファクトリークラス
*/
class ColaFactory extends DrinkFactory
{
public function createDrink(): Drink
{
return new Cola();
}
}
<?php
/**
* オレンジジュースファクトリークラス
*/
class OrangeJuiceFactory extends DrinkFactory
{
public function createDrink(): Drink
{
return new OrangeJuice();
}
}
<?php
/**
* コーラクラス
*/
class Cola implements Drink
{
public function getName(): string
{
return 'コーラ';
}
}
<?php
/**
* オレンジジュースクラス
*/
class OrangeJuice implements Drink
{
public function getName(): string
{
return 'オレンジジュース';
}
}
<?php
$colaFactory = new ColaFactory();
$cola = $colaFactory->createDrink();
echo $cola->getName(); // 出力: コーラ
$orangeJuiceFactory = new OrangeJuiceFactory();
$orangeJuice = $orangeJuiceFactory->createDrink();
echo $orangeJuice->getName(); // 出力: オレンジジュース