📐 デザインパターン ラボ

デザインパターンの「地図」を手に入れよう

GoF(Gang of Four)の三分類(生成構造振る舞い)を軸に、 現代的な開発での使いどころ・実装例・アンチパターンまで、必要なところにすぐ飛べる作りにしました。

コードタブ(PHP/JS/Java/Swift) 検索・絞り込み コピー対応 目次自動生成

概要

デザインパターンは「よくある設計課題に対する、再利用可能な解決テンプレート」です。 乱用すると硬直化しますが、適切に使えば変更に強い設計を実現できます。

基本

まずは三分類・責務分割・依存の向き(上位→下位ではなく抽象に依存)を把握。

生成 構造 振る舞い SOLID原則 依存性逆転

基礎

代表パターンをサンプルでざっと掴み、最後に自分の言葉で要点を説明できるかを確認しましょう。

Singleton(シングルトン)

生成

インスタンスをアプリ全体で1つに制限する。

#グローバル状態#共有資源
final class Config {
  private static ?Config $instance = null;
  private function __construct(){}
  public static function getInstance(): Config {
    return self::$instance ??= new Config();
  }
}
使いどころ/アンチパターン
  • 使いどころ:Singleton(シングルトン)がハマる典型ケースを探す
  • 注意:過剰抽象・早すぎる最適化は避ける

Strategy(ストラテジ)

振る舞い

アルゴリズムを差し替え可能なオブジェクトとして切り出す。

#切替#テスト容易
interface SortStrategy { public function sort(array $list): array; }
class QuickSort implements SortStrategy { public function sort(array $list): array { /* ... */ return $list; } }
class BubbleSort implements SortStrategy { public function sort(array $list): array { /* ... */ return $list; } }
class ListView { function __construct(private SortStrategy $s){} function render(array $l){ return $this->s->sort($l); }}
使いどころ/アンチパターン
  • 使いどころ:Strategy(ストラテジ)がハマる典型ケースを探す
  • 注意:過剰抽象・早すぎる最適化は避ける

Observer(オブザーバ)

振る舞い

状態の変化を購読者に通知する。

#イベント#購読
class Subject {
  private array $obs = [];
  function attach(callable $o){ $this->obs[] = $o; }
  function setState($v){ foreach($this->obs as $o){ $o($v); } }
}
使いどころ/アンチパターン
  • 使いどころ:Observer(オブザーバ)がハマる典型ケースを探す
  • 注意:過剰抽象・早すぎる最適化は避ける

Factory Method(ファクトリメソッド)

生成

生成の手順をサブクラスに委譲して拡張点にする。

#拡張#依存逆転
abstract class Dialog { abstract protected function createButton(): Button; }
class WebDialog extends Dialog { protected function createButton(): Button { return new HtmlButton(); } }
使いどころ/アンチパターン
  • 使いどころ:Factory Method(ファクトリメソッド)がハマる典型ケースを探す
  • 注意:過剰抽象・早すぎる最適化は避ける

Adapter(アダプタ)

構造

既存クラスを目的のインターフェイスに“変換”。

#互換#レガシー連携
class JsonLogger { function write(string $m){ echo json_encode(["m"=>$m]); } }
interface Logger { public function log(string $m): void; }
class LoggerAdapter implements Logger {
  function __construct(private JsonLogger $j){}
  public function log(string $m): void { $this->j->write($m); }
}
使いどころ/アンチパターン
  • 使いどころ:Adapter(アダプタ)がハマる典型ケースを探す
  • 注意:過剰抽象・早すぎる最適化は避ける

Decorator(デコレータ)

構造

機能をラップして動的に拡張する。

#拡張#オプション機能
interface Notifier { public function send(string $msg):void; }
class BasicNotifier implements Notifier { public function send(string $msg):void { echo $msg; } }
class SlackDecorator implements Notifier {
  function __construct(private Notifier $n){}
  public function send(string $msg):void { $this->n->send($msg); /* Slack送信 */ }
}
使いどころ/アンチパターン
  • 使いどころ:Decorator(デコレータ)がハマる典型ケースを探す
  • 注意:過剰抽象・早すぎる最適化は避ける

Facade(ファサード)

構造

複雑なサブシステムに単純な窓口を用意。

#API化#単純化
class MediaFacade {
  function __construct(private Encoder $e, private Storage $s){}
  function transcodeAndSave($file){ $bin = $this->e->encode($file); return $this->s->put($bin); }
}
使いどころ/アンチパターン
  • 使いどころ:Facade(ファサード)がハマる典型ケースを探す
  • 注意:過剰抽象・早すぎる最適化は避ける

Builder(ビルダー)

生成

複雑オブジェクトの生成手順を分離・段階化。

#不変#段階設定
class UserBuilder {
  private array $d=[];
  function name($n){ $this->d["name"]=$n; return $this; }
  function build(){ return (object)$this->d; }
}
使いどころ/アンチパターン
  • 使いどころ:Builder(ビルダー)がハマる典型ケースを探す
  • 注意:過剰抽象・早すぎる最適化は避ける

最新情報

ローカル latest_design_patterns.json が存在すれば自動読込します(存在しない場合はデモ表示)。

応用

発展

モジュラモノリス、イベント駆動、CQRS/ES、Clean Architecture 等のアーキテクチャパターンへ接続。

リファクタリング・指針
  1. 臭い(God Class / Feature Envy / Shotgun Surgery)を検知
  2. 責務の分解 → 適切なパターン適用を検討
  3. メトリクス(循環的複雑度、結合度、凝集度)で回帰確認

関連リンク