Factory: جوهر نمطي Factory Method وAbstract Factory

المؤلف: IT Sectr نُشر: 2026-02-17 وقت القراءة: 7 دق

Factory — نمط إنشائي يفوض إنشاء الكائنات إلى طرق المصنع. في تطوير التطبيقات المحمولة، يتم استخدام Factory Method وAbstract Factory لإنشاء ViewModel وNetworkClient وRepository والتبعيات الأخرى. Factory يعزل منطق الإنشاء، مما يبسط استبدال التطبيقات. المزيد من التفاصيل — على Refactoring Guru: Factory Method.

الخلاصة

  • Factory — نمط إنشائي لإنشاء كائنات دون تحديد فئة محددة
  • Factory Method — أسلوب في فئة فائقة، يتم تجاوزه في فئات فرعية لإنشاء كائنات
  • Abstract Factory — واجهة لإنشاء عائلات من الكائنات المترابطة
  • الاختبار — المصانع تبسط استبدال التطبيقات بكائنات mock في الاختبارات
  • DI vs Factory — حقن التبعية يحل محل المصانع في التطبيقات الحديثة

ما هو Factory: جوهر نمط إنشاء الكائنات؟

Factory — نمط تصميم إنشائي من كتالوج GoF. الفكرة الرئيسية: نقل منطق إنشاء الكائنات من كود العميل إلى أسلوب أو فئة منفصلة. يعمل العميل مع واجهة أو فئة مجردة، بينما يتم إنشاء التطبيق المحدد بواسطة المصنع. هذا يحقق مبدأ عكس التبعية: العميل لا يعتمد على فئات محددة، فقط على التجريدات.

نوعان من Factory: Factory Method وAbstract Factory. Factory Method — أسلوب واحد في فئة تجاوزه الفئات الفرعية لإنشاء كائنات. Abstract Factory — واجهة مع عائلة من طرق المصنع لإنشاء مجموعات من الكائنات المترابطة. كلا النوعين يحلان نفس المشكلة: العميل لا يستدعي new MyClass() مباشرة، بل يطلب من المصنع إنشاء كائن حسب نوعه أو معلماته.

Factory vs new() — الإنشاء المباشر للكائنات يربط الكود بقوة بتطبيق محدد. يضيف Factory طبقة: تغيير التطبيق يتطلب تعديل المصنع فقط، وليس جميع العملاء. في تطوير التطبيقات المحمولة، يُستخدم Factory بنشاط لإنشاء ViewModel (ViewModelProvider.Factory) وعملاء الشبكة (Retrofit.create()) ومحولات القوائم ومصانع التسلسل. حاويات DI (Dagger, Koin) تولد المصانع تلقائياً.

Factory Method: أمثلة بلغة Swift وKotlin

Factory Method — أسلوب معلن في بروتوكول أو فئة مجردة يعيد كائنًا من نوع محدد. تنفذ الفئات الفرعية الأسلوب، مما ينشئ مثيلات محددة. في Swift، يمكن أن يكون أسلوبًا ثابتًا في بروتوكول أو أسلوبًا في فئة أساسية. في Kotlin — companion object مع أسلوب مصنع أو open fun في فئة مجردة. يُستخدم النمط على نطاق واسع لإنشاء المحللات ومصانع الأخطاء ومنشئي الاستعلامات.

swift
protocol PaymentGateway {
    func processPayment(amount: Decimal) async throws -> PaymentResult
}

final class StripeGateway: PaymentGateway { /* ... */ }
final class ApplePayGateway: PaymentGateway { /* ... */ }

enum PaymentType { case stripe, applePay }

final class PaymentFactory {
    // Factory Method
    static func create(type: PaymentType) -> PaymentGateway {
        switch type {
        case .stripe: return StripeGateway()
        case .applePay: return ApplePayGateway()
        }
    }
}

// الاستخدام
let gateway = PaymentFactory.create(type: .stripe)

نسخة Kotlin من Factory Method تستخدم companion object أو sealed class لتحديد الأنواع. تضمن sealed class أن فرع when يغطي جميع الأنواع الممكنة — يتحقق المترجم من الاكتمال. هذا نموذجي لمشاريع Android حيث ينشئ المصنع تطبيقات مختلفة من Repository أو DataSource حسب build flavour أو التكوين.

kotlin
sealed class PaymentType {
    object Stripe : PaymentType()
    object ApplePay : PaymentType()
}

interface PaymentGateway {
    suspend fun processPayment(amount: BigDecimal): PaymentResult
}

class PaymentFactory {
    companion object {
        fun create(type: PaymentType): PaymentGateway = when (type) {
            PaymentType.Stripe -> StripeGateway()
            PaymentType.ApplePay -> ApplePayGateway()
        }
    }
}

Abstract Factory: عائلات الكائنات المترابطة

Abstract Factory — نمط لإنشاء عائلات من الكائنات المترابطة أو المترابطة دون تحديد فئاتها المحددة. يعمل العميل مع واجهة المصنع المجرد، الذي يحدد طرقًا لإنشاء كل منتج من العائلة. ينفذ مصنع محدد الواجهة وينشئ كائنات من نسخة محددة. على سبيل المثال، مصنع مكونات واجهة المستخدم لنظام iOS ينشئ UIButton وUILabel وUITableView، بينما لنظام Android — Button وTextView وRecyclerView.

Abstract Factory vs Factory Method — ينشئ Factory Method نوعًا واحدًا من الكائنات من خلال الوراثة، وينشئ Abstract Factory عائلة من الكائنات من خلال التركيب. يتم تجاوز Factory Method في الفئات الفرعية، ويوفر Abstract Factory طرق مصنع متعددة من خلال بروتوكول. غالبًا ما يحتوي Abstract Factory على عدة Factory Method. في تطوير التطبيقات المحمولة، يُستخدم Abstract Factory للمكونات المعتمدة على المنصة وسمات التصميم ومصانع قواعد البيانات.

الخاصيةFactory MethodAbstract Factory
عدد المنتجاتواحدعائلة (متعددة)
الآليةالوراثة (override)التركيب (بروتوكول/واجهة)
مثال iOSPaymentFactory.create()UIComponentFactory لنظامي iOS/Android
مثال AndroidViewModelProvider.FactoryThemeFactory: إنشاء أزرار ونصوص وبطاقات
المرونةاستبدال بسيط للفئة الفرعيةاستبدال كامل للعائلة

حالة واقعية لـ Abstract Factory في Android — تنفيذ أنواع مختلفة من قواعد البيانات (SQLite vs Room) من خلال واجهة DatabaseFactory واحدة. ينشئ المصنع كائنات DAO وعمليات الترحيل ومجموعات الاتصال. في iOS — مصنع خدمات لبيئات مختلفة (Development/Staging/Production). نادراً ما يُستخدم Abstract Factory مباشرة — وظائفه تتولاها حاويات DI (Dagger Module, Swinject Assembly).

Factory في iOS: البروتوكولات والطرق الثابتة

Swift Factory يتم تنفيذه من خلال البروتوكولات والطرق الثابتة. يعلن بروتوكول Factory عن أسلوب create() يعيد نوعًا مجردًا. ينفذ مصنع محدد البروتوكول وينشئ الكائنات المطلوبة. لا تتطلب Swift فئة مصنع منفصلة للحالات البسيطة — أسلوب ثابت في enum أو struct يكفي. للسيناريوهات المعقدة، يُستخدم بروتوكول Factory مع حقن DI.

Factory في iOS SDK — العديد من مصانع النظام: UIStoryboard.instantiateViewController(withIdentifier:) وNSKeyedUnarchiver.unarchivedObject(ofClass:from:) وJSONDecoder().decode(_:from:). ينشئ المطورون مصانع لـ ViewController (StoryboardFactory) وللخدمات (ServiceFactory) ولنماذج البيانات. يُستخدم Factory Method بنشاط في معماريتي VIPER وClean Swift لإنشاء وحدات الشاشات.

Factory + DI — بديل حديث: حاوية DI (Swinject, Factory) تولد تلقائياً مصانع للأنواع المسجلة. تخزن الحاوية وصفات إنشاء الكائنات وتحل التبعيات. مكتبة Factory (github.com/hmlongco/Factory) تستخدم @Injected(.service) للحقن التلقائي. تُختبر مصانع DI باستبدال وحدة كاملة بسطر واحد: container.register { MockService() }.

Factory في Android: companion factory ووحدات DI

Android Factory — مثال كلاسيكي: ViewModelProvider.Factory لإنشاء ViewModel بمعلمات. توصي Google باستخدام Hilt للتوليد التلقائي لمصانع ViewModel — تُنشئ @HiltViewModel التعليق التوضيحي Factory تلقائياً. للكائنات البسيطة، يُستخدم companion object مع أسلوب create() أو invoke(). في Kotlin، يسمح عامل invoke باستدعاء المصنع كدالة: Factory(param).

Factory في Jetpack Compose — تُستخدم المصانع لإنشاء الحالات والتأثيرات. remember { Factory.create() } ينشئ كائنًا عند أول عرض ويحافظ عليه طوال دورة حياة composable. يتم إنشاء ViewModel في Compose عبر viewModel() — هذا مصنع يديره Hilt. في Compose، تكون المصانع أقل شيوعًا بشكل صريح، حيث أن DI وCompose StateManager يتوليان إنشاء الكائنات.

Factory vs Hilt — Dagger/Hilt يولد المصانع تلقائياً في وقت الترجمة. @Module + @Provides يحل محل Factory Method، @Binds يحل محل Abstract Factory. تظل المصانع اليدوية ذات صلة للاختيار الديناميكي للتطبيق في وقت التشغيل (اختبار A/B، feature flags). للتبعيات الثابتة، يقوم Hilt بأتمتة إنشاء الكائنات بالكامل — يكتب المطور فقط الواجهات والتعليقات التوضيحية.

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

كيف يختلف Factory Method عن Abstract Factory؟

ينشئ Factory Method نوعًا واحدًا من الكائنات من خلال الوراثة — تتجاوز الفئة الفرعية أسلوب المصنع. ينشئ Abstract Factory عائلة من الكائنات من خلال التركيب — تعلن واجهة المصنع عن طرق لمنتجات متعددة. Factory Method أبسط، Abstract Factory أكثر مرونة للمكونات المعتمدة على المنصة أو الموضوعية.

متى نستخدم Factory بدلاً من DI؟

Factory مبرر للاختيار الديناميكي للتطبيق في وقت التشغيل (اختبارات A/B، feature flags، API مختلف لمستويات مختلفة). DI (Hilt, Dagger, Koin) أفضل للتبعيات الثابتة — يؤتمت الإنشاء والحقن. Factory وDI لا يستبعدان بعضهما البعض: يمكن لـ DI استخدام Factory داخل وحدة.

كيف نختبر الكود الذي يستخدم Factory؟

يُختبر Factory باستبدال المصنع من خلال بروتوكول. في الاختبار، يتم إنشاء TestFactory تنفذ نفس البروتوكول وتعيد كائنات mock. لطرق Factory الثابتة، يكون الاختبار أكثر تعقيداً — يتطلب حاوية DI أو swizzling. يُوصى دائمًا باستخدام بروتوكول لـ Factory للحفاظ على قابلية الاختبار.

ما هو ViewModelProvider.Factory في Android؟

ViewModelProvider.Factory هي واجهة من Jetpack تسمح بإنشاء ViewModel بمعلمات مخصصة. بدون مصنع، يتم إنشاء ViewModel من خلال الانعكاس ويمكن أن يكون له مُنشئ فارغ فقط. يقبل Factory معلمات (مستودع، سياق التطبيق) ويمررها إلى مُنشئ ViewModel. يولد Hilt Factory تلقائياً لـ @HiltViewModel.

كيف يرتبط Factory بمبدأ الفتح/الإغلاق؟

ينفذ Factory مبدأ الفتح/الإغلاق: النظام مفتوح للتمديد (يُضاف تطبيق جديد إلى المصنع) ولكنه مغلق للتعديل (كود العميل لا يتغير). إضافة نوع جديد من المنتج يتطلب تعديل المصنع فقط، وليس جميع العملاء. هذه هي الميزة الرئيسية لـ Factory على الإنشاء المباشر للكائنات.

الملخص

  • Factory — نمط إنشائي لإنشاء كائنات من خلال التجريد
  • Factory Method — أسلوب واحد يتم تجاوزه في الفئات الفرعية
  • Abstract Factory — واجهة لإنشاء عائلة من الكائنات
  • iOS — بروتوكولات وطرق ثابتة للمصانع
  • Android — companion object وViewModelProvider.Factory وHilt
  • DI vs Factory — DI يؤتمت الإنشاء، Factory للاختيار الديناميكي
  • الاختبار — بروتوكول Factory إلزامي لاستبدال التطبيقات

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا