🎨 درس دوم: الگوهای طراحی (Design Patterns)؛ راهحلهای استاندارد برای مشکلات تکراری
🎯 هدف این درس: آشنایی با الگوهای طراحی کلاسیک و پرکاربرد در PHP شامل Singleton، Factory، Strategy و Observer. یادگیری اینکه چگونه از چرخ دوباره اختراع کردن چرخ پرهیز کنیم و کدهای ماژولار بنویسیم.
مهمان عزیز! 👋
در درس قبل با اصول SOLID آشنا شدیم تا بدانیم «چگونه» کد تمیز بنویسیم. اما در دنیای واقعی، ما دائماً با مشکلات تکراری روبرو میشویم:
- چطور مطمئن شویم فقط یک نمونه از یک کلاس (مثل اتصال دیتابیس) وجود دارد؟
- چطور اشیاء را بدون وابستگی مستقیم به کلاس سازنده ایجاد کنیم؟
- چطور رفتار یک شیء را در زمان اجرا تغییر دهیم؟
الگوهای طراحی (Design Patterns) پاسخهای اثباتشدهای به این سوالات هستند. آنها نقشههای استانداردی هستند که توسط برنامهنویسان باتجربه در طول سالها تدوین شدهاند.
💡 چرا Design Pattern؟
استفاده از الگوها باعث میشود کد شما برای سایر توسعهدهندگان قابل پیشبینی باشد. وقتی کسی نام “Singleton” را میشنود، دقیقاً میداند ساختار کد شما چگونه است، حتی قبل از دیدن آن.
1️⃣ الگوی Singleton (تکنمونه)
این الگو تضمین میکند که یک کلاس فقط یک نمونه داشته باشد و یک نقطه دسترسی سراسری به آن فراهم کند. بهترین کاربرد آن برای اتصالات دیتابیس یا تنظیمات اصلی سایت است.
Database.php
PHP
8.x
class Database {
// نگهدارنده نمونه یکتا
private static $instance = null;
// جلوگیری از ساخت مستقیم شیء
private function __construct() {
// کد اتصال به دیتابیس اینجا قرار میگیرد
}
// متد عمومی برای دریافت نمونه
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
// استفاده:
$db = Database::getInstance();
2️⃣ الگوی Factory (کارخانه)
این الگو مسئولیت ساخت اشیاء را بر عهده میگیرد. به جای اینکه در کد اصلی بنویسیم new ClassName()، از یک کلاس Factory استفاده میکنیم. این کار وابستگیها را کاهش میدهد.
PaymentFactory.php
PHP
8.x
interface Payment {
public function pay($amount);
}
class CreditCard implements Payment {
public function pay($amount) { /* ... */ }
}
class PayPal implements Payment {
public function pay($amount) { /* ... */ }
}
class PaymentFactory {
public static function create($type) {
switch ($type) {
case 'credit': return new CreditCard();
case 'paypal': return new PayPal();
default: throw new Exception("Invalid payment type");
}
}
}
3️⃣ الگوی Strategy (استراتژی)
این الگو به شما اجازه میدهد الگوریتمها را در زمان اجرا انتخاب کنید. مثلاً اگر بخواهید روش محاسبه تخفیف را بسته به نوع کاربر تغییر دهید، به جای استفاده از if/else های تو در تو، از Strategy استفاده میکنید.
DiscountStrategy.php
PHP
8.x
interface DiscountStrategy {
public function calculate($price);
}
class NoDiscount implements DiscountStrategy {
public function calculate($price) { return $price; }
}
class VIPDiscount implements DiscountStrategy {
public function calculate($price) { return $price * 0.8; }
}
class Order {
private $strategy;
public function __construct(DiscountStrategy $strategy) {
$this->strategy = $strategy;
}
public function getFinalPrice($price) {
return $this->strategy->calculate($price);
}
}
4️⃣ الگوی Observer (مشاهدهگر)
این الگو برای ایجاد ارتباط بین اشیاء استفاده میشود بدون اینکه به هم وابسته باشند. وقتی یک شیء تغییر میکند، تمام وابستگان آن مطلع میشوند. پایهی اصلی سیستمهای Event-Driven است.
EventDispatcher.php
PHP
8.x
class EventDispatcher {
private $listeners = [];
public function addListener($event, $callback) {
$this->listeners[$event][] = $callback;
}
public function dispatch($event, $data) {
if (isset($this->listeners[$event])) {
foreach ($this->listeners[$event] as $listener) {
call_user_func($listener, $data);
}
}
}
}
❌ خطاهای رایج در استفاده از الگوها
🚫 اشتباه رایج:
استفاده اجباری از الگوها در پروژههای کوچک (Over-engineering). اگر یک اسکریپت ساده دارید، نیازی به پیادهسازی کامل MVC یا Factory نیست. الگوها باید مشکل را حل کنند، نه اینکه کد را پیچیده کنند.
- نامگذاری اشتباه: نامگذاری کلاسها طوری که شبیه الگو باشند اما رفتار الگو را نداشته باشند.
- نادیده گرفتن سادگی: گاهی اوقات یک تابع ساده بهتر از یک الگوی پیچیده است.
🏁 جمعبندی درس دوم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ الگوی Singleton برای مدیریت منابع مشترک.
- ✅ الگوی Factory برای جداسازی فرآیند ساخت شیء.
- ✅ الگوی Strategy برای تغییر رفتار در زمان اجرا.
- ✅ الگوی Observer برای ارتباط غیرمستقیم بین اشیاء.
🎓 تمرین عملی درس دوم
سعی کن الگوی Observer را برای یک سیستم ساده “ارسال نوتیفیکیشن” پیادهسازی کنی. وقتی کاربر جدید ثبتنام کرد، هم ایمیل ارسال شود و هم در لاگ سیستم ثبت گردد.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | اصول SOLID در PHP | تکمسئولیتی، باز/بسته، جایگزینی لیسکوف، جداسازی رابط، وارونگی وابستگی |
| ۲ | الگوهای طراحی (Design Patterns) | Singleton, Factory, Strategy, Observer, MVC پیشرفته |
| ۳ | برنامهنویسی تابعی در PHP | توابع ناشناس (Closures)، Arrow Functions، Map/Filter/Reduce |
| ۴ | مدیریت وابستگی با Composer | نصب پکیجها، مدیریت نسخهها، Autoloading (PSR-4) |
| ۵ | تستنویسی حرفهای (TDD) | آشنایی با PHPUnit، نوشتن Unit Test، Mocking |
| ۶ | کار با Redis و Caching | کش کردن دادهها، Session Handler با Redis |
| ۷ | پردازشهای پسزمینه (Queue & Jobs) | استفاده از صفها برای ایمیلزنی یا پردازش سنگین |
| ۸ | API نویسی حرفهای (RESTful) | استانداردهای REST، احراز هویت با JWT، Rate Limiting |
| ۹ | امنیت سایبری پیشرفته | تحلیل حملات پیچیده، Secure Headers، CSP |
| ۱۰ | پروژه نهایی پیشرفته | ساخت یک CMS ماژولار با قابلیت نصب پلاگین و تم |



