ファクトリパターン
オブジェクトの生成をカプセル化して、
サブクラスがインスタンスを生成するためのインターフェースを提供する。
例)
自動車工場で異なるモデルの車を作って、顧客の注文に応じて最適な車を組み立てる。
以下のメリットがある。
- 柔軟性:顧客の要求に応じて、異なるモデルの車を生成できる
- コードの整理:オブジェクト生成ロジックを一箇所にまとめることで、コードのメンテナンスが容易になる
// 共通動作である運転をインターフェースとして、各車種のタイプでクラスを定義。(= ポリモーフィズム)
interface Car {
public function drive();
}
class Sedan implements Car {
public function drive() {
echo 'セダンを運転します';
}
}
class SUV implements Car {
public function drive() {
echo 'SUVを運転します';
}
}
// 決して自動車工場の工場にかけて命名しているのではなく、factoryクラスだということを表しています…
class CarFactory {
public static function createCar($type) {
if($type === 'sedan') {
return new Sedan();
} else if($type === 'suv') {
return new SUV();
}
return null;
}
}
// 顧客の注文に応じて車を生成
$car1 = carFactory::createCar('sedan');
$car2 = carFactory::createCar('suv');
// 生成した車を走らせてみる
$cars = [$car1, $car2];
foreach($cars as $car) {
echo "試運転を開始します。{$car->drive()}";
}