موضوع أنماط التصميم تحظى بشعبية كبيرة. تم تصوير الكثير من مقاطع الفيديو عليها وكُتبت مقالات. يجمع بين جميع هذه المواد مع "المضادة للنمط." تعقيد عرضي. ونتيجة لذلك ، فإن الأمثلة صعب المنال ، والوصف مربك ، وكيفية التقديم غير واضحة. والمهمة الرئيسية لأنماط التصميم - لم يتحقق التبسيط (من التعليمات البرمجية ، والعمل بشكل عام). بعد كل شيء ، استخدام القالب يتطلب جهدا إضافيا. تقريبا نفس اختبار وحدة.
سأحاول شرح أنماط التصميم من حيث كيفية تطبيقها وأين ولماذا.
يمكن أن تعزى ستة مولدات إلى:
- النموذج (نموذج)،
- مصنع مجردة ،
- طريقة المصنع
- البناء (البناء)،
- واحد (سينغلتون)،
- تهيئة كسول.
جميع الأنماط الأخرى التي تتعلق بالمولدات هي حالة خاصة للتطبيق وليس هناك أي فائدة في المسكن عليها.
يمكن تقسيم أنماط التوليد إلى ثلاث مجموعات ، حول السؤال الذي يجيبون عليه. لذلك ، ثلاثة أسئلة:
إلى أين؟
توجد ثلاثة أنماط تجيب على هذا السؤال: النموذج الأولي ، المصنع التجريدي ، وطريقة المصنع.
قليلا عن الشروطفي إطار مفهوم OOP ، لا يوجد سوى ثلاثة أماكن حيث من الناحية النظرية من الممكن إنشاء مثيل جديد.
- المنتج هو الفئة التي تم إنشاء مثيل لها.
- العميل هو الفئة التي ستستخدم مثيل مثيل.
- شريك - أي فئة ثالثة في مجال رؤية العميل.
في الواقع ، تحدد هذه الأنماط مكان الجيل. بالإضافة إلى ذلك ، يتم توصيلها بشكل هرمي ولها نطاق مختلف. يظهر الاتصال في الشكل ، تحدد الأسهم اتجاه المكالمات.

عند تنفيذه ، يمكن لـ "طريقة المصنع" تفويض إنشاء مثيل إما إلى "المصنع" الحالي أو "النموذج الأولي". ومع ذلك ، يجب ألا يعتمد "النموذج الأولي" على أي شخص ويفعل كل شيء بمفرده. الآن بمزيد من التفاصيل.
"نموذج"
هذا القالب يتوافق مع المكان "المنتج" ، في الواقع ، هو مُنشئ الفصل. وفقًا لذلك ، يتم دائمًا إنشاء مثيل لفئة محددة (معروفة سابقًا).
في إطار هذا القالب ، يعرف المُنشئ المعلمات التي تم تمريرها إليه مباشرة فقط (عدد المعلمات يميل إلى عدد حقول الفصل). بالطبع ، هناك حق الوصول الكامل إلى جميع الحقول والخصائص للفئة التي تم إنشاؤها.
تسمح لك الطرق التي تم تنفيذها بشكل صحيح من "النموذج الأولي" بالتخلص من طرق التهيئة الإضافية في الأماكن العامة. في المقابل ، تصبح الواجهة الخارجية للفصل الدراسي أسهل وأقل إغراء لاستخدام الفصل لأغراض أخرى.
ما يعطينا هذا القالب:
- اتصال منخفض - الفئة لا تعرف إلا نفسها ، لا تعتمد على بيانات خارجية ؛
- القابلية للتوسعة - يمكن إعادة تعريف الصانعين أو إضافتهم إلى أحفادهم ؛
من السلبيات:
- للفئات المعقدة ، قد تحتاج إلى تمرير العديد من المعلمات للتهيئة. على الرغم من وجود حل تافه.
- الاستخدام المباشر في العميل يمكن أن يضعف قابلية القراءة ويمنع عملياً إمكانية تجاوز نوع المثيل الذي يتم إنشاؤه في سليل العميل.
القالب الأكثر شعبية. الجميع يستخدمه ، لكن القليل منهم يعرفون ما الذي يستخدمه. انه لامر جيد حتى يتم الحصول على نموذج العمل الأول ، حتى يتم تعريف الطبقات وعلاقاتهم تماما. بعد ذلك ، تجهيز وزيادة التجريد إلزامية.
"مصنع مجردة"
بعض شريك الصف. يمكن أن تكون متخصصة ، أو "الجمع". قد يكون ثابت (لا مثيل). مثال على "الجمع" يمكن أن يكون فئة التكوين. ويمكن أيضا أن تكون مخفية وراء الواجهة.
يشاهد "المصنع" عادة جميع الإعدادات العامة للتطبيق (أو نظام فرعي منفصل). يمكن تفويض الجيل الفوري إلى النموذج الأولي. في الوقت نفسه ، سيكون عدد معلمات الإدخال في طريقة Factory أقل من مُنشئ Prototype مماثل. المصنع لا يقرر من الذي سيقوم بإنشائه بناءً على المعلمات الواردة.
هذا القالب مناسب جدًا وسهل التنفيذ ، لكنه يتطلب تصميمًا أوليًا. إذا قمت بإنشاء مصانع لكل شيء ، فسيؤدي ذلك إلى تعقيد الكود. في الواقع ، حصلنا على نظير للنموذج الأولي ، لكننا انتقلنا إلى فئة طرف ثالث.
من الايجابيات:
- إعادة تعريف جيدة في أحفاد
- دعوة مبسطة
- على أساس المصنع ، من السهل تطبيق الاستبدال (قالب الدولة)
ولكن هناك أيضا عيوب:
- يتطلب التصميم ، خاصة بالنسبة للمصانع العالمية (التي تستخدم في العديد من المشاريع). بمعنى آخر ، الحصول على مصنع جيد على الفور ليس بالأمر السهل.
- من السهل جدًا فك الشفرة ، هناك مجالان رئيسيان:
- الانزلاق نحو النموذج الأولي ، ولكن في فصل خارجي. الأساليب محملة بالمعلمات ؛ هناك العديد من الأساليب نفسها. نتيجة لذلك ، الميراث صعب ، سواء في المصنع نفسه أو في العميل.
- مصنع مع طريقة عالمية. هذه الطريقة تقوم بإرجاع أي مثيل بناءً على المعلمات التي تم تمريرها. النتيجة ، كما في الحالة الأولى.
شعبية جدا. يتم استخدام هذا القالب من قبل أولئك الذين حضروا دورة GoF. وكقاعدة عامة ، يصبح الرمز أسوأ من "قبل تطبيق القوالب".
من المنطقي عندما تظهر المصانع أثناء إعادة صياغة الكود الأول. في هذه المرحلة ، أصبحت مجموعات المعلمات للحالات التي تم إنشاؤها معروفة بالفعل ، ولن يكون من الصعب كتابة أساليب المصنع المعممة. نتيجة لذلك ، سيتم تبسيط المكالمات في العميل.
في بعض الحالات ، من المريح إخفاء المصانع خلف الواجهة. على سبيل المثال ، يحتوي التطبيق على عشرات من مصانعه ، وعشرات من المكتبات. بالنسبة لهم ، يمكنك بناء واجهة. سيسمح هذا بعدم ربط المكتبات بكل وحدة ، كما أنه من السهل استبدال مصنع بمصنع آخر.
طريقة المصنع
قمة التجريد في الأنماط التوليدية. مكان المنشأ العملاء. تتمتع الفئة التي يوضع فيها كل منتج في طريقة المصنع بفرصة طويلة العمر. إذا بدون تعصب ، فإن المحور المفترض للتنمية يجب أن يعتمد بالضرورة على هذا القالب.
طريقة المصنع لا ترى ما وراء فئتها. يجب أن يكون عدد المعلمات المرسلة مباشرة الحد الأدنى (بحد الصفر). يجب بناء الطريقة نفسها مع الأخذ في الاعتبار إمكانية التداخل في السليل.
خطأ شائع هو التهيئة المعقدة في طريقة واحدة. على سبيل المثال ، عند إنشاء نسخة معقدة (قالب الباني) ، يتم وضع إنشاء جميع أجزاء الكائن المستقبلي في طريقة واحدة. نتيجة لذلك ، من الصعب تداخل هذه الطريقة في السليل.
من الايجابيات:
- سيكون من السهل مطابقة طريقة قالب القالب
- نحصل على رمز موجز يكون فيه المنطق مرئيًا بوضوح (لا يلزم البحث عنه بين مجموعة من الأساليب والمعلمات)
هناك أساسا لا سلبيات.
لا يتم استخدام هذا القالب تقريبًا. وكقاعدة عامة ، لا يمكن رؤيته إلا في المشروعات بتفاصيل أولية عميقة. مثالي عندما يفوض أسلوب المصنع إنشاء "المصنع" أو "النموذج الأولي".
مثال صغير
لدينا فئة لتسجيل الدخول إلى ملف على القرص الصلب. هكذا تبدو الطرق العامة في أنماط "أين؟":
النموذج الأولي:
constructor Create(aFilename: string; aLogLevel: TLogLevel);
كل ما يجب أن يعرف المصمم يتم تمريره إليه في شكل معلمات.
مصنع:
function GetLogger(aLogLevel: TLogLevel): ILogger;
يعرف المصنع أي ملف يكتب إليه ، كما هو محدد في إعدادات التطبيق.
طريقة المصنع:
function NewLogger: ILogger;
في فئة العميل ، يُعرف بتفاصيل تسجيل الدخول.
في هذا التصميم ، من أجل استبدال فئة التسجيل بكعب ، يكفي إعادة تعريف NewLogger في سليل العميل. هذا مفيد عند إجراء اختبارات الوحدة.
لتسجيل الدخول إلى قاعدة البيانات ، يكفي تجاوز أسلوب GetLogger في سليل المصنع.