0Pricing
PHP Academy · درس

الأنماط الإنشائية: Factory وBuilder وSingleton

تحكّم في إنشاء الكائنات بنظافة باستخدام الأنماط الإنشائية.

الأنماط الإنشائية: Factory وBuilder وSingleton درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.

التحكم في الإنشاء

تفصل أنماط الإنشاء بين ما تحتاج إليه وكيفية بنائه. عندما يكون الإنشاء مشروطًا أو متعدد الخطوات أو يجب أن يكون مركزيًا، فإن نثر new في أنحاء قاعدة الشيفرة يربط المستدعِين بالأصناف الملموسة. نستعرض هنا المصنع (وطريقة المصنع)، والباني لتجميع الكائنات المعقدة، وSingleton (مع محاذيره).

المصنع البسيط

يُركّز المصنع البسيط قرار الإنشاء خلف طريقة واحدة. يطلب المستدعُون نوعًا منطقيًا ويحصلون على نسخة ملموسة مُهيّأة، من دون معرفة أسماء الأصناف.

<?php
interface Notifier { public function send(string $msg): string; }
final class EmailNotifier implements Notifier {
    public function send(string $m): string { return "email: $m"; }
}
final class SmsNotifier implements Notifier {
    public function send(string $m): string { return "sms: $m"; }
}

final class NotifierFactory {
    public static function make(string $channel): Notifier {
        return match ($channel) {
            'email' => new EmailNotifier(),
            'sms'   => new SmsNotifier(),
            default => throw new InvalidArgumentException($channel),
        };
    }
}
echo NotifierFactory::make('sms')->send('Hi'), PHP_EOL;

طريقة المصنع

يؤجل نمط طريقة المصنع إنشاء النسخ إلى الأصناف الفرعية. يعرّف الصنف الأساسي خوارزمية تستدعي create() مجردة؛ ويحدد كل صنف فرعي المنتج الملموس. وهذا يتوافق مع مبدأ OCP: إذ يمكنك إضافة منشئ جديد من دون تعديل المنشئات الحالية.

<?php
abstract class ReportExporter {
    abstract protected function create(): string;
    public function export(): string {
        return 'Exported as ' . $this->create();
    }
}
final class PdfExporter extends ReportExporter {
    protected function create(): string { return 'PDF'; }
}
final class CsvExporter extends ReportExporter {
    protected function create(): string { return 'CSV'; }
}
echo (new PdfExporter())->export(), PHP_EOL;
echo (new CsvExporter())->export(), PHP_EOL;

المصنع المجرّد

ينتج المصنع المجرّد عائلات من الكائنات المترابطة التي يجب استخدامها معًا، مثل MySqlConnection وMySqlQueryBuilder. ويضمن توافق الأجزاء لأن مصنعًا واحدًا ينتج المجموعة كاملة. استخدمه عندما يجب أن تظل عائلة المنتجات متسقة داخليًا.

الباني: المشكلة

عندما يحتاج الكائن إلى معاملات اختيارية كثيرة، تتحول المنشئات إلى قوائم معاملات موضعية يصعب قراءتها أو إلى تحميلات زائدة متداخلة، وهي ميزة لا يوفرها PHP أصلًا. يجمع نمط الباني كائنًا معقدًا خطوةً خطوة، ثم يعيد في النهاية منتجًا مكتملًا وصالحًا.

الباني بطلاقة

يعيد الباني المتسلسل $this من كل أداة ضبط، ثم تنتج build() النتيجة غير القابلة للتغيير. يحافظ هذا على بساطة المنتج نفسه، وينقل منطق التجميع إلى الباني.

<?php
final class Query {
    public function __construct(public readonly string $sql) {}
}
final class QueryBuilder {
    private string $table = '';
    private array $where = [];
    public function from(string $t): self { $this->table = $t; return $this; }
    public function where(string $c): self { $this->where[] = $c; return $this; }
    public function build(): Query {
        $sql = "SELECT * FROM {$this->table}";
        if ($this->where) { $sql .= ' WHERE ' . implode(' AND ', $this->where); }
        return new Query($sql);
    }
}
echo (new QueryBuilder())->from('users')->where('age > 18')->build()->sql, PHP_EOL;

الباني مقارنةً بالمنشئات المسمّاة

في الحالات الأبسط، تتفوق المعاملات المسمّاة في PHP 8 والمنشئات المسمّاة (طرائق المصنع الثابتة) غالبًا على استخدام باني كامل.

  • استخدم المعاملات المسمّاة عندما تكون كل البيانات متاحة دفعة واحدة.
  • استخدم الباني عندما يكون التجميع متعدد الخطوات أو مشروطًا أو مُعاد الاستخدام عبر مواضع استدعاء مختلفة.
<?php
final class Money {
    private function __construct(public readonly int $cents, public readonly string $cur) {}
    public static function fromDollars(float $d): self {
        return new self((int) round($d * 100), 'USD');
    }
    public static function zero(string $cur = 'USD'): self {
        return new self(0, $cur);
    }
}
var_dump(Money::fromDollars(19.99)->cents); // int(1999)

Singleton

يضمن Singleton وجود نسخة واحدة مع نقطة وصول عامة. نفّذه باستخدام منشئ خاص وأداة وصول ثابتة. ويكون مفيدًا فعلًا للأشياء التي يجب أن تكون فريدة حقًا ضمن عملية واحدة، لكنه أيضًا أكثر الأنماط إساءةً في الاستخدام.

<?php
final class Config {
    private static ?self $instance = null;
    private array $data = ['debug' => true];
    private function __construct() {}
    public static function instance(): self {
        return self::$instance ??= new self();
    }
    public function get(string $k): mixed { return $this->data[$k] ?? null; }
}
var_dump(Config::instance()->get('debug'));
var_dump(Config::instance() === Config::instance()); // true

لماذا يسبب Singleton مشكلات

تُدخل أنماط Singleton حالة عامة مخفية: إذ يصل المستدعُون إلى Config::instance() بدلًا من التصريح بالاعتمادية، مما يعيق قابلية الاختبار والتنفيذ المتوازي. في PHP الحديثة، يُفضّل تسجيل نسخة مشتركة واحدة في حاوية DI بدورة حياة «نسخة واحدة» وحقنها. وهكذا تحصل على نسخة واحدة من دون الربط العام.

اختيار الأداة المناسبة

  • المصنع البسيط/طريقة المصنع: إخفاء الأصناف الملموسة خلف قرار إنشاء.
  • المصنع المجرّد: إنتاج عائلات منتجات متوافقة.
  • الباني: تجميع الكائنات المعقدة خطوةً خطوة.
  • Singleton: خيار أخير؛ ويُفضّل استخدام الخدمات المشتركة التي تديرها الحاوية.

تقلل هذه الأنماط الأربعة جميعًا الاقتران بالمنشئات الملموسة، مما يجعل توسيع الشيفرة واختبارها أسهل.

مصنع قائم على السجل

يبحث مصنع أكثر ديناميكية عن المنشئات في سجل، بحيث تسجّل الأنواع الجديدة نفسها من دون تعديل المصنع، محققًا بذلك التوافق الحقيقي مع OCP. هكذا تحل أنظمة الإضافات ومُسلسِلات البيانات اسم النوع إلى منشئ أثناء التشغيل.

<?php
interface Shape { public function name(): string; }
final class Circle implements Shape { public function name(): string { return 'circle'; } }
final class Square implements Shape { public function name(): string { return 'square'; } }

final class ShapeRegistry {
    private array $creators = [];
    public function register(string $key, callable $factory): void {
        $this->creators[$key] = $factory;
    }
    public function create(string $key): Shape {
        return ($this->creators[$key] ?? throw new InvalidArgumentException($key))();
    }
}
$r = new ShapeRegistry();
$r->register('circle', fn() => new Circle());
$r->register('square', fn() => new Square());
echo $r->create('square')->name(), PHP_EOL; // square

فحص سريع

اختر أداة الإنشاء الأنسب للسيناريو.

مراجعة

تحكمتم في إنشاء الكائنات باستخدام أنماط الإنشاء: المصانع لإخفاء الأنواع الملموسة واختيار عائلات المنتجات، والبواني لتجميع الكائنات المعقدة بطلاقة، وSingleton مع موازنة مزاياه وعيوبه. والخلاصة الحديثة: استخدموا المصانع والبواني بحرية، لكن استبدلوا Singleton بدورة حياة النسخة المشتركة في حاوية DI، للحفاظ على الاعتماديات صريحة وقابلة للاختبار.

الأسئلة الشائعة

هل درس «الأنماط الإنشائية: Factory وBuilder وSingleton» مجاني؟

نعم — نص درس «الأنماط الإنشائية: Factory وBuilder وSingleton» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.

ماذا ستتعلم في «الأنماط الإنشائية: Factory وBuilder وSingleton»؟

تحكّم في إنشاء الكائنات بنظافة باستخدام الأنماط الإنشائية. تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟

لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الأنماط الإنشائية: Factory وBuilder وSingleton»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟

نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مبادئ SOLID في التطبيق
  2. الأنماط الإنشائية: Factory وBuilder وSingleton
  3. الأنماط الهيكلية: Adapter وDecorator وFacade
  4. الأنماط السلوكية: Strategy وObserver وCommand
← العودة إلى PHP Academy