デザイン パターンは、ソフトウェア開発において広く実証されているソリューションです。これらは、保守可能でスケーラブルで再利用性の高いコード構造を構築するのに役立ちます。 PHP でデザイン パターンを適用すると、コードの品質が向上するだけでなく、複雑なビジネス ニーズに直面したときのシステムの柔軟性も高まります。
デザイン パターンは一般に、創造、構造、動作の 3 つのカテゴリに分類されます。各カテゴリには、異なる焦点と使用シナリオがあります。
作成パターンは、オブジェクトの作成プロセスをカプセル化し、具体的なクラスからコードを分離するために使用されます。一般的な作成パターンには次のようなものがあります。
構造パターンはクラスとオブジェクトの組み合わせに焦点を当てており、システムをより柔軟で保守しやすくすることを目的としています。一般的な構造パターンは次のとおりです。
行動パターンは、オブジェクト間の通信方法と責任の配分を記述するために使用されます。主なモードには次のものがあります。
次の例は、ファクトリー、エージェント、ストラテジ パターンなど、ショッピング カート システムで動作するデザイン パターンを示しています。
interface DiscountServiceFactory {
public static function create(): DiscountService;
}
class NormalDiscountService implements DiscountService {
// ...
}
class PremiumDiscountService implements DiscountService {
// ...
}
class DiscountServiceFactoryImpl implements DiscountServiceFactory {
public static function create(): DiscountService {
if (isPremiumCustomer()) {
return new PremiumDiscountService();
}
return new NormalDiscountService();
}
}
ファクトリ パターンを使用すると、具体的なクラスに直接依存せずに、ユーザー タイプに基づいてさまざまな割引サービス インスタンスを柔軟に作成できます。
class CartLoggerProxy extends Cart {
private $logger;
public function __construct(Cart $cart, Logger $logger) {
parent::__construct();
$this->cart = $cart;
$this->logger = $logger;
}
public function addItem(Item $item): void {
parent::addItem($item);
$this->logger->log("Added item to cart");
}
// 他の方法も同様に拡張できます
}
プロキシ モードは、ログ記録や権限制御の追加など、中間層 (プロキシ) を通じて元のクラスの機能を強化します。
interface DiscountStrategy {
public function calculateDiscount(Cart $cart): float;
}
class NoDiscountStrategy implements DiscountStrategy {
public function calculateDiscount(Cart $cart): float {
return 0;
}
}
class FlatDiscountStrategy implements DiscountStrategy {
private $discount;
public function __construct(float $discount) {
$this->discount = $discount;
}
public function calculateDiscount(Cart $cart): float {
return $cart->getTotal() * $this->discount;
}
}
// アプリケーションポリシー
$context = new DiscountContext();
if (isPremiumCustomer()) {
$context->setStrategy(new PremiumDiscountStrategy());
} else {
$context->setStrategy(new NoDiscountStrategy());
}
$discount = $context->calculateDiscount();
ストラテジーモードでは、異なる割引アルゴリズムを自由に切り替えることができるため、システムの柔軟性と拡張性が向上します。
デザインパターンは単なるプログラミングスキルではなく、思考でもあります。ファクトリ、エージェント、ストラテジなどのパターンを合理的に使用することで、PHP プロジェクトの構造をより明確かつ柔軟にし、複雑なシナリオでも良好な保守性を維持できます。これらのパターンをマスターすると、PHP 開発の強固な基盤が築かれます。