バックエンド

デザインパターンを実装する:シングルトン、ファクトリー、MVC

デザインパターンは、ソフトウェア開発における問題を効率的に解決するための再利用可能な設計テンプレートです。本記事では、特に人気の高い「シングルトン」「ファクトリー」「MVC」の3つのパターンについて、実装例を交えながら解説します。

デザインパターンを理解することで、コードの再利用性や保守性が向上し、チーム開発やプロジェクトの効率化につながります。それでは、各パターンを具体的に見ていきましょう。

シングルトンパターンとは?

定義と目的

シングルトンパターンは、クラスのインスタンスが1つだけであることを保証し、そのインスタンスにグローバルアクセスを提供するデザインパターンです。

例えば、アプリケーション全体で1つだけ必要な設定管理クラスやログ管理クラスに適しています。

実装例 (PHP)

以下はPHPでシングルトンパターンを実装する例です。

class Singleton {
    private static $instance = null;

    private function __construct() {
        // コンストラクタをprivateにして外部からのインスタンス化を防ぐ
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
}

// 使用例
$singleton = Singleton::getInstance();

ポイント:

  • コンストラクタをprivateにすることで、クラス外からのインスタンス化を防ぎます。
  • 静的メソッドgetInstanceを使ってインスタンスを取得します。

ファクトリーパターンとは?

定義と目的

ファクトリーパターンは、オブジェクトの生成を専用のファクトリーメソッドに委ねるデザインパターンです。これにより、クライアントコードと生成ロジックを分離できます。

例えば、異なる種類のオブジェクトを柔軟に生成する場合に便利です。

実装例 (PHP)

以下はファクトリーパターンの簡単な例です。

interface Product {
    public function getName(): string;
}

class ProductA implements Product {
    public function getName(): string {
        return "Product A";
    }
}

class ProductB implements Product {
    public function getName(): string {
        return "Product B";
    }
}

class ProductFactory {
    public static function createProduct(string $type): Product {
        return match ($type) {
            'A' => new ProductA(),
            'B' => new ProductB(),
            default => throw new InvalidArgumentException("Invalid product type"),
        };
    }
}

// 使用例
$product = ProductFactory::createProduct('A');
echo $product->getName(); // Output: Product A

ポイント:

  • ファクトリーメソッドでオブジェクト生成ロジックをカプセル化。
  • 新しいタイプの製品が追加されても、クライアントコードに影響を与えません。

MVCパターンとは?

定義と目的

MVC (Model-View-Controller) は、アプリケーションを以下の3つのコンポーネントに分割するデザインパターンです。

  • Model: データとビジネスロジックを管理
  • View: ユーザーインターフェースを担当
  • Controller: ユーザーの入力を処理し、ModelやViewと連携

実装例 (PHP)

以下は簡単なMVCの例です。

Model

class UserModel {
    private $data = ["name" => "John Doe", "email" => "john@example.com"];

    public function getUserData(): array {
        return $this->data;
    }
}

View

class UserView {
    public function render(array $userData): void {
        echo "Name: {$userData['name']}, Email: {$userData['email']}";
    }
}

Controller

class UserController {
    private $model;
    private $view;

    public function __construct(UserModel $model, UserView $view) {
        $this->model = $model;
        $this->view = $view;
    }

    public function displayUser(): void {
        $data = $this->model->getUserData();
        $this->view->render($data);
    }
}

// 使用例
$model = new UserModel();
$view = new UserView();
$controller = new UserController($model, $view);
$controller->displayUser();

ポイント:

  • 各コンポーネントが責務を明確に分担します。
  • 拡張性が高く、変更が容易です。

まとめ

この記事では、デザインパターンの中でも特に重要な「シングルトン」「ファクトリー」「MVC」について解説しました。それぞれのパターンを適切に活用することで、コードの保守性や可読性が向上します。

次のステップ:
他のデザインパターン(例えばObserverやDecorator)についても学び、幅広い設計スキルを身につけましょう。

-バックエンド
-, , , ,