سؤال

كنت أتساءل، لماذا ثابت Create توجد طرق؟

على سبيل المثال ، لماذا استخدم هذا الرمز:

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);

على هذا الرمز:

System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);

لا يمكنني العثور على الأساس المنطقي لاستخدام واحد على الآخر ، ولا يمكنني العثور على أي علاقة بين الفئات التي تستخدم هذا البناء على الآخر.

هل يستطيع اي شخص ان يسلط الضوء على هذا؟

هل كانت مفيدة؟

المحلول

XmlReader هو فئة مجردة. لا يمكنك إنشاء مثيل لها.

توفير Create الطريقة هي مثيل لنمط المصنع. اعتمادًا على الوسائط المحددة ، يتم اختيار تنفيذ مختلف لـ XMLReader وإعادته. على سبيل المثال ، هناك تطبيقات XMLReader غير التحقق من صحة وغير مؤلفة في إطار .NET.

نصائح أخرى

إجابة أكثر عمومية ...

السبب في أن الناس مثل هذه الأنواع من الأساليب ، والمعروفة باسم "أساليب المصنع الثابت" ، هو أنه يمكنك منحهم اسمًا (على عكس المُنشئين). لذلك إذا كنت بحاجة إلى ثلاثة منشئات مختلفة ، فيمكنك بدلاً من ذلك إنشاء أساليب مصنع ثابتة لها أسماء ذات صلة باستخدامها.

سبب آخر هو أن طريقة المصنع لا تحتاج حقًا إلى إنشاء كائنات جديدة - يمكن أن تعيد نفس الطريقة مرارًا وتكرارًا إذا لزم الأمر.

لأنه يمكن في الواقع إنشاء وكائن من النوع المشتق الذي لا يمكنك الوصول إلى فئة مجردة أو إرجاعها (كما أجاب DTB). هذا هو نمط طريقة المصنع.

لا يمكن استخدام مُنشئ إلا لإنشاء مثيلات فئة محددة ، في حين أن ثابتًا Create يمكن أن تنشئ الطريقة مثيلًا لفئات مختلفة حسب الإدخال.

في حالة XmlReader فئة Create الطريقة ستعود XmlDictionaryReader, XmlTextReader, XmlValidatingReader أو XmlNodeReader, ، اعتمادًا على الحمل الزائد الذي تستخدمه وما هي المعلمات التي ترسلها إليها.

هذا النمط يسمح ل XmlReader الفصل لتزويدك بحالات من الفئات المشتقة المصممة للمعلمات التي انتقلت إليها Create. لاحظ على وجه الخصوص الحمولة الزائدة التي تقبل XmlReaderSettings هدف. مختلف XmlReader يمكن إرجاع الفئة الفرعية إليك اعتمادًا على إعداداتك.

مثال أفضل هو WebRequest.Create(url). اعتمادًا على عنوان URL الذي تمر به ، قد تتلقى ملف HttpWebRequest, ، و FtpWebRequest, ، إلخ.

  • لأنك لست مضطرًا للالتزام بالفئة الدقيقة للكائن الذي تحصل عليه. يمكن للمنشدين فقط بناء كائنات من فئة واحدة بالضبط.
  • لأنه يمكنك إعطاء الطريقة اسمًا ذا معنى ، مثل bigint.probablePrime (). يمكن أن يكون للمنشدين نفس اسم الفصل.
  • نظرًا لأنه يمكن أن يكون لديك أكثر من طريقة مصنع لنفس مجموعة نوع المعلمة ، على سبيل المثال ، point.fromombolarcoords (int ، int) و point.fromcartesiancoords (int ، int) ، ولكن يمكن أن تكون هناك نقطة مُنشئة واحدة فقط (int ، int).

(يتم تقديم إجابة أكثر تفصيلاً في "Java الفعالة" لـ Bloch.)

في بعض الأحيان تكون موجودة كشكل من أشكال التوثيق الذاتي. لدي مكون وصول DB يمكنني إنشاء مثيله إما باستخدام سلسلة اتصال أو اسم الاتصال في ملف التكوين. تأخذ كلتا الطريقتين السلاسل كمعلمة بحيث لا يمكن التمييز بينها بواسطة الحجج وحدها. لذلك قمت بإنشاء أ FromConnectionString(string) طريقة المصنع و FromConnectionName(string) طريقة المصنع. سوف تضيع هذه الفوارق تمامًا من قبل أ new Foo(bool, string) خط.

الفكرة هي أنه بهذه الطريقة يمكنهم تغيير تنفيذ XMLReader وعدم كسر أي رمز مستخدم (على سبيل المثال ، يمكنهم تغيير النوع الفعلي الذي يتم إرجاعه من طريقة إنشاء).

أنا شخصياً لا أحب هذا النهج ، لأنه يخلق علاقة عكسية في التسلسل الهرمي لفئة XMLReader. ربما اعتقدوا أن نمط المصنع هو مبالغة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top