ما هي أنماط التصميم ولماذا هي مطلوبة في PHP؟
أنماط التصميم هي حلول مثبتة للمشكلات النمطية التي تظهر أثناء تطوير البرمجيات. إنها ليست كودًا جاهزًا، بل قوالب يمكن تكييفها مع موقف معين. لمطور PHP، تساعد معرفة الأنماط في كتابة كود أكثر مرونة وقابلية للصيانة والتوسع.
في هذه المقالة، سنغطي أربعة أنماط أساسية من كتالوج GoF (مجموعة الأربعة) الأكثر استخدامًا في مشاريع PHP الحقيقية. سيصاحب كل نمط مثال عملي وشروحات.
1. Singleton (مفرد)
يضمن نمط Singleton أن يكون للفئة مثيل واحد فقط ويوفر نقطة وصول عامة إليه. هذا مفيد لإدارة اتصالات قواعد البيانات أو السجلات (loggers) أو التخزين المؤقت (cache).
متى يتم تطبيقه؟
- عند الحاجة إلى كائن واحد بالضبط (مثل اتصال قاعدة بيانات).
- عند استخدام الكائن في جميع أنحاء التطبيق، ولا يُسمح بإنشاء نسخ مكررة.
مثال على التنفيذ:
<?phpclass DatabaseConnection{ private static ?self $instance = null; private PDO $pdo;
private function __construct() { $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); }
public static function getInstance(): self { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }
public function getConnection(): PDO { return $this->pdo; }
// منع الاستنساخ وإلغاء التسلسل private function __clone() {} public function __wakeup() { throw new \\Exception("Cannot unserialize singleton"); }}
// الاستخدام:$db = DatabaseConnection::getInstance();$pdo = $db->getConnection();?>هام: غالبًا ما يتم انتقاد Singleton لانتهاكه مبدأ المسؤولية الواحدة (single responsibility principle) وتعقيده للاختبار. استخدمه بوعي وفقط حيثما يكون ضروريًا حقًا.
2. Factory Method (طريقة المصنع)
يحدد نمط Factory Method واجهة لإنشاء كائن ولكنه يسمح للفئات الفرعية بتغيير نوع الكائن الذي سيتم إنشاؤه. هذا يسمح بتفويض منطق إنشاء الكائن إلى الفئات الفرعية.
متى يتم تطبيقه؟
- عند عدم معرفة الكائن المحدد الذي سيحتاج إلى الإنشاء مسبقًا.
- عند الرغبة في إخفاء منطق إنشاء الكائن المعقد عن العميل.
مثال على التنفيذ:
<?php// واجهة لجميع أنواع الإشعاراتinterface Notification{ public function send(string $message): void;}
// تطبيقات ملموسةclass EmailNotification implements Notification{ public function send(string $message): void { echo "Sending email: {$message}"; }}
class SMSNotification implements Notification{ public function send(string $message): void { echo "Sending SMS: {$message}"; }}
// المنشئ المجردabstract class NotificationFactory{ abstract public function createNotification(): Notification;
public function notify(string $message): void { $notification = $this->createNotification(); $notification->send($message); }}
// مصانع ملموسةclass EmailFactory extends NotificationFactory{ public function createNotification(): Notification { return new EmailNotification(); }}
class SMSFactory extends NotificationFactory{ public function createNotification(): Notification { return new SMSNotification(); }}
// الاستخدام:$factory = new EmailFactory();$factory->notify("Your order has been confirmed!");
$factory = new SMSFactory();$factory->notify("Confirmation code: 1234");