RAJESTARY DIGITAL TECH • SECURITY • EDUCATION
دانش • فناوری • امنیت

دنیای تکنولوژی
از یادگیری شروع می‌شود

آموزش‌های کاربردی، برنامه‌نویسی، امنیت و فناوری برای ساختن، یادگرفتن و بهتر زندگی کردن با تکنولوژی.

LEARN BUILD SECURE CREATE

الگوهای طراحی (Design Patterns)؛ راه‌حل‌های استاندارد برای مشکلات تکراری

الگوهای طراحی (Design Patterns)؛ راه‌حل‌های استاندارد برای مشکلات تکراری

🎨 درس دوم: الگوهای طراحی (Design Patterns)؛ راه‌حل‌های استاندارد برای مشکلات تکراری

👋

سلام مهمان عزیز!

برای دسترسی به تمام محتوا و امکانات، وارد شوید.

🎯 هدف این درس: آشنایی با الگوهای طراحی کلاسیک و پرکاربرد در PHP شامل Singleton، Factory، Strategy و Observer. یادگیری اینکه چگونه از چرخ دوباره اختراع کردن چرخ پرهیز کنیم و کدهای ماژولار بنویسیم.

مهمان عزیز! 👋
در درس قبل با اصول SOLID آشنا شدیم تا بدانیم «چگونه» کد تمیز بنویسیم. اما در دنیای واقعی، ما دائماً با مشکلات تکراری روبرو می‌شویم:

  • چطور مطمئن شویم فقط یک نمونه از یک کلاس (مثل اتصال دیتابیس) وجود دارد؟
  • چطور اشیاء را بدون وابستگی مستقیم به کلاس سازنده ایجاد کنیم؟
  • چطور رفتار یک شیء را در زمان اجرا تغییر دهیم؟

الگوهای طراحی (Design Patterns) پاسخ‌های اثبات‌شده‌ای به این سوالات هستند. آن‌ها نقشه‌های استانداردی هستند که توسط برنامه‌نویسان باتجربه در طول سال‌ها تدوین شده‌اند.

💡 چرا Design Pattern؟

استفاده از الگوها باعث می‌شود کد شما برای سایر توسعه‌دهندگان قابل پیش‌بینی باشد. وقتی کسی نام “Singleton” را می‌شنود، دقیقاً می‌داند ساختار کد شما چگونه است، حتی قبل از دیدن آن.


1️⃣ الگوی Singleton (تک‌نمونه)

این الگو تضمین می‌کند که یک کلاس فقط یک نمونه داشته باشد و یک نقطه دسترسی سراسری به آن فراهم کند. بهترین کاربرد آن برای اتصالات دیتابیس یا تنظیمات اصلی سایت است.



1️⃣
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 استفاده می‌کنیم. این کار وابستگی‌ها را کاهش می‌دهد.



2️⃣
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 استفاده می‌کنید.



3️⃣
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 است.



4️⃣
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 ماژولار با قابلیت نصب پلاگین و تم

🔗 لینک‌های مرتبط

👤
نویسنده یونس رجستری
📅
تاریخ انتشار 28 مرداد 1405
🔄
آخرین بروزرسانی 28 مرداد 1405
ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

⚠️

هشدار مهم!

برای اتصال به درگاه پرداخت و انجام تراکنش، لطفاً VPN یا فیلترشکن خود را خاموش کنید.

⏳ ادامه در
5
ثانیه