ما هو الفرق الأساسي بين أنماط تصميم المصنع والتجريدية؟ [مغلق

StackOverflow https://stackoverflow.com/questions/1001767

سؤال

ما هو الفرق الأساسي بين أنماط المصنع وأنماط المصنع المجردة؟

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

المحلول

مع نمط المصنع ، يمكنك إنتاج مثيلات للتطبيقات (Apple, Banana, Cherry, ، وما إلى ذلك) من واجهة معينة - قل ، IFruit.

مع نمط المصنع التجريدي ، يمكنك توفير وسيلة لأي شخص لتقديم مصنعه الخاص. هذا يسمح للمستودع الخاص بك أن يكون إما IFruitFactory أو IJuiceFactory, ، دون مطالبة المستودع الخاص بك لمعرفة أي شيء عن الفواكه أو العصائر.

نصائح أخرى

مصدر لهذه المعلومات مأخوذة من: http://java.dzone.com/news/intro-design-patterns-abstract

مجردة المصنع مقابل طريقة المصنع

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

يتكون نمط المصنع التجريدي من مجموعة مجردة و concretefactory و proclectproduct و concreteproduct والعميل.

كيفية التنفيذ

يمكن تنفيذ نمط المصنع التجريدي باستخدام نمط طريقة المصنع أو نمط النموذج الأولي أو نمط المفرد. يمكن تنفيذ الكائن ConcreteFactory كقائد مفردة حيث هناك حاجة إلى مثيل واحد فقط من الكائن ConcreteFactory.

نمط طريقة المصنع هو نسخة مبسطة من نمط المصنع التجريدي. نمط طريقة المصنع مسؤول عن إنشاء منتجات تنتمي إلى عائلة واحدة ، في حين أن نمط المصنع التجريدي يتعامل مع عائلات متعددة من المنتجات.

تستخدم طريقة المصنع واجهات وفئات مجردة لفصل العميل من فئة المولد والمنتجات الناتجة. يحتوي المصنع الملخص على مولد يمثل حاوية للعديد من أساليب المصنع ، إلى جانب واجهات تفوق العميل من المولد والمنتجات.

متى تستخدم نمط طريقة المصنع

استخدم نمط طريقة المصنع عندما تكون هناك حاجة إلى فصل العميل من منتج معين يستخدمه. استخدم طريقة المصنع لتخفيف عميل المسؤولية عن إنشاء وتكوين مثيلات المنتج.

متى تستخدم نمط المصنع التجريدي

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

أمثلة:

مثال المصنع التجريدي 1

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

مثال مصنع مجردة 2:

يتوافق معدات الختم مع المصنع التجريدي ، لأنه واجهة للعمليات التي تنشئ كائنات منتج مجردة. يتوافق يموت مع المصنع الخرساني ، لأنها تنشئ منتجًا ملموسًا. كل فئة جزء (غطاء محرك السيارة ، الباب ، إلخ) يتوافق مع المنتج التجريدي. أجزاء محددة (أي الباب الجانبي للسائق لـ 99 كامري) تتوافق مع المنتجات الخرسانية.

مثال على طريقة المصنع:

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

نمط المصنع: المصنع ينتج تنفيذ المنتج

نمط المصنع التجريدي: ينتج المصنع عن طريق المصنع ifactories ، والتي بدورها تنتج منتجات iProducts :)

تحديث وفقًا للتعليقات
ما كتبته سابقًا غير صحيح وفقًا لـ ويكيبيديا على الأقل. مصنع مجردة هو ببساطة واجهة مصنع. مع ذلك ، يمكنك تبديل المصانع الخاصة بك في وقت التشغيل ، للسماح للمصانع المختلفة في سياقات مختلفة. أمثلة يمكن أن تكون مصانع مختلفة لمختلف OS'Es ، مزودي SQL ، سائقي الوسيطة ، إلخ ..

نمط المصنع التجريدي

  • توفير واجهة لإنشاء عائلات من الكائنات ذات الصلة أو التابعة دون تحديد فصولها الملموسة.

  • يشبه نمط المصنع التجريدي نمط طريقة المصنع. أحد الاختلافات بين الاثنين هو أنه مع نمط المصنع التجريدي ، يقوم الفئة بتفويض مسؤولية تثبيت الكائن إلى كائن آخر عبر التكوين في حين يستخدم نمط طريقة المصنع الميراث ويعتمد على الفئة الفرعية للتعامل مع مثيل الكائن المطلوب.

  • في الواقع ، يستخدم الكائن المفوض بشكل متكرر أساليب المصنع لأداء التوليف!

نمط المصنع

  • أنماط المصنع هي أمثلة على الأنماط الإبداعية

  • الأنماط الإبداعية الملخص عملية إنشاء كائن. يخفيون كيفية إنشاء الكائنات ويساعدون في جعل النظام العام مستقلًا عن كيفية إنشاء كائناته وتكوينها.

  • تركز الأنماط الإبداعية الطبقية على استخدام الميراث لتحديد الكائن المراد أن يكون طريقة المصنع

  • تركز أنماط إبداع الكائن على تفويض التثبيت إلى مصنع مجردة كائن آخر

المرجعي:المصنع مقابل المصنع التجريدي

طريقة المصنع: لديك مصنع ينشئ كائنات مستمدة من فئة قاعدة معينة

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

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

enter image description here

الاختلاف الأساسي:

مصنع: ينشئ كائنات دون تعريض منطق التثبيت للعميل.

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

مصنع مجردة: يوفر واجهة لإنشاء عائلات من الكائنات ذات الصلة أو التابعة دون تحديد فصولها الملموسة.

AbstractFactory يستخدم Pattern تكوين لتفويض مسؤولية إنشاء كائن إلى فئة أخرى طريقة المصنع يستخدم النمط الميراث ويعتمد على فئة مشتقة أو فئة فرعية لإنشاء كائن

من oodesign مقالات:

مصنع الرسم التخطيطي للفصل:

enter image description here

مثال: StaticFactory

 public class ShapeFactory {

   //use getShape method to get object of type shape 
   public static Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

يتوفر مثال المصنع غير الأساسي لتنفيذ المصنع في هذا المنشور:

أنماط التصميم: المصنع مقابل طريقة المصنع مقابل المصنع التجريدي

متى يجب استخدام: العميل يحتاج فقط إلى فصل دراسي ولا يهتم بالتنفيذ الملموس الذي يحصل عليه.

طريقة المصنع digaram class:

enter image description here

متى يجب استخدام: لا يعرف العميل الفئات الملموسة التي ستكون مطلوبة لإنشائها في وقت التشغيل ، ولكنه يريد فقط الحصول على فصل دراسي يقوم بالمهمة.

مصنع مجردة الرسم التخطيطي فئة من dzone

enter image description here

متى يجب استخدام: عندما يتعين على نظامك إنشاء عائلات متعددة من المنتجات أو ترغب في توفير مكتبة من المنتجات دون تعريض تفاصيل التنفيذ.

أمثلة رمز المصدر في المقالات أعلاه جيدة جدًا لفهم المفاهيم بوضوح.

سؤال SE ذو الصلة مع مثال على الكود:

نمط المصنع. متى تستخدم أساليب المصنع؟

اختلافات:

  1. غالبًا ما يتم تنفيذ فصول المصنع المجردة بطرق المصنع ، ولكن يمكن تنفيذها أيضًا باستخدام النموذج الأولي
  2. تبدأ التصميمات باستخدام طريقة المصنع (تتكاثر الفئات الفرعية الأقل تعقيدًا وأكثر تخصيصًا) وتتطور نحو أنماط خلق أخرى (أكثر مرونة وأكثر تعقيدًا) حيث هناك حاجة إلى مزيد من المرونة.
  3. عادة ما تسمى أساليب المصنع في طرق القالب.

مقالات مفيدة أخرى:

Factory_Method من صناعة العواء

Abstract_Factory من صناعة العواء

مجردة-فائدة التصميم من Journaldev

مثال/سيناريو للمصنع التجريدي

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

لذلك من خلال النظر إلى السيناريو أعلاه ، أقدر الآن كفاءة حارس المتجر. يمكنني استبدال صاحب المتجر هذا متجر مجردة. العناصر التي نحصل عليها مع العناصر المجردة وأنا والأثرياء كعملاء المنظور. كل ما نحتاجه هو المنتج/العنصر الذي يناسب احتياجاتنا.

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

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

منتجات مجردة: جزء الإعلان ، القائمة ، رسام واجهة المستخدم.
مصنع مجردة: تجربة مستخدم متجر الويب
Concreate Factory: تجربة المستخدم المتميزة ، تجربة المستخدم الذهبي ، تجربة المستخدم العام.

سيشعر الكثير من الناس بالدهشة ربما ، لكن هذا السؤال هو غير صحيح. إذا سمعت هذا السؤال أثناء المقابلة ، فأنت بحاجة إلى مساعدة القائم بإجراء المقابلة على فهم مكان الارتباك.

لنبدأ من حقيقة أنه لا يوجد نمط ملموس يسمى "المصنع" فقط. هناك نمط يسمى "مصنع مجردة" ، وهناك نمط يسمى "طريقة المصنع".

إذن ، ماذا يعني "المصنع" إذن؟ واحد مما يلي (يمكن اعتبار كل شيء صحيحًا ، اعتمادًا على نطاق المرجع):

  • بعض الناس يستخدمونها كمستعار (اختصار) لـ "مصنع مجردة".
  • بعض الناس يستخدمونها كمستعار (اختصار) لـ "طريقة المصنع".
  • يستخدمه بعض الناس كاسم أكثر عمومية لجميع الأنماط المصنع/الإبداع. على سبيل المثال كل من "المصنع التجريدي" و "طريقة المصنع" هي المصانع.

و، لسوء الحظ, ، يستخدم الكثير من الناس "المصنع" للدلالة على نوع آخر من المصنع ، الذي يخلق المصنع أو المصانع (أو واجهاتهم). بناءً على نظريتهم:

يقوم المنتج بتنفيذ IProduct ، والذي يتم إنشاؤه بواسطة Factory ، والذي ينفذ ifactory ، والذي يتم إنشاؤه بواسطة AbstractFactory.

لفهم مدى سخافة هذا ، دعنا نستمر في معادمنا:

AbstractFactory ينفذ IABSTRECTFACTORY ، والذي يتم إنشاؤه بواسطة ... AbstractabstractFactory ؟؟؟

أتمنى أن ترى هذه النقطة. لا تشعر بالارتباك ، ورجاء لا تخترع أشياء غير موجودة للعقل.

-

ملاحظة: مصنع للمنتجات مجردة ، وسيكون المصنع للمصانع التجريدية مجرد مثال آخر على الملخص أيضًا.

//Abstract factory - Provides interface to create factory of related products
interface PizzaIngredientsFactory{    
   public Dough createDough(); //Will return you family of Dough
   public Clam createClam();   //Will return you family of Clam
   public Sauce createSauce(); //Will return you family of Sauce
}

class NYPizzaIngredientsFactory implements PizzaIngredientsFactory{

   @Override
   public Dough createDough(){
      //create the concrete dough instance that NY uses
      return doughInstance;
   }

   //override other methods
} 

يتم بالفعل توفير تعريفات الكتاب النصي من خلال إجابات أخرى. اعتقدت أنني سأقدم مثالاً عليه أيضًا.

حتى هنا PizzaIngredientsFactory هو مصنع مجردة لأنه يوفر طرقًا لإنشاء عائلة من المنتجات ذات الصلة.

لاحظ أن كل طريقة في المصنع التجريدي هي طريقة المصنع في ذاته. يحب createDough() في حد ذاته طريقة مصنع سيتم توفير تطبيقات ملموسة بواسطة فئات فرعية مثل NYPizzaIngredientsFactory. لذلك يمكن أن يؤدي استخدام كل موقع مختلف إلى إنشاء مثيلات من المكونات الخرسانية التي تنتمي إلى موقعها.

طريقة المصنع

يوفر مثيلًا للتنفيذ الملموس

في المثال:
- createDough() - يوفر تنفيذ ملموس للعجين. لذلك هذه طريقة مصنع

مصنع مجردة

يوفر واجهة لإنشاء عائلة من الكائنات ذات الصلة

في المثال:
- PizzaIngredientsFactory هو مصنع مجردة لأنه يسمح بإنشاء مجموعة ذات صلة من الكائنات مثل Dough, Clams, Sauce. لإنشاء كل عائلة من الكائنات ، فإنه يوفر طريقة المصنع.

مثال من رأس أنماط التصميم الأولى

لدي بعض النقاط للمساهمة في إجابة جون على النحو التالي:

مصنع مجردة مصنع للمصانع!

مع "طريقة المصنع" (لأن "المصنع" غامض) ، فإنك تنتج تطبيقات (Lemon, Orange, ، وما إلى ذلك) من واجهة معينة - قل ، IFruit. يمكن استدعاء هذا المصنع CitricFruitFactory.

ولكن الآن تريد إنشاء أنواع أخرى من الفاكهة التي لا يستطيع Citricfruitfactory إنشاءها. ربما رمز CitricFruitFactory لن يكون له معنى إذا قمت بإنشاء Strawberry في ذلك (الفراولة ليست فاكهة الستريك!).

لذلك يمكنك إنشاء مصنع جديد يسمى RedFruitFactory أن ينتج Strawberry, Raspberry, ، إلخ.

كما قال جون فيمينيلا: "مع نمط المصنع التجريدي ، يمكنك إنتاج تطبيقات لواجهة مصنع معينة - على سبيل المثال ، IFruitFactory. كل من هؤلاء يعرفون كيفية إنشاء أنواع مختلفة من الفاكهة ".

التي تنفذ IFruitFactory نكون CitricFruitFactory و RedFruitFactory!

مصادري هي: StackOverflow, tutorialspoint.com, programmers.stackexchange.com و CodeProject.com.


Factory Method (أيضا يسمى Factory) هو لعميل Decouple من Interface تطبيق. للعينة لدينا أ Shape واجهة مع اثنين Circle و Square التطبيقات. لقد حددنا فئة المصنع مع طريقة المصنع مع معلمة المحدد مثل Type والتنفيذ الجديد ذات الصلة من Shape واجهه المستخدم.


Abstract Factory يحتوي على العديد من طريقة المصنع أو واجهة المصنع بواسطة العديد من تطبيقات المصنع. للعينة التالية أعلاه لدينا ملف Color واجهة مع اثنين Red و Yellow التطبيقات. لقد حددنا أ ShapeColorFactory واجهة مع اثنين RedCircleFactory و YellowSquareFactory. الكود التالي لشرح هذا المفهوم:

interface ShapeColorFactory
{
    public Shape getShape();
    public Color getColor();
}

class RedCircleFactory implements ShapeColorFactory
{
    @Override
    public Shape getShape() {
        return new Circle();
    }

    @Override
    public Color getColor() {
        return new Red();
    }
}
class YellowSquareFactory implements ShapeColorFactory
{
    @Override
    public Shape getShape() {
        return new Square();
    }

    @Override
    public Color getColor() {
        return new Yellow();
    }
} 

هنا الاختلاف بين FactoryMethod و AbstractFactory. Factory Method كما مجرد إرجاع فئة ملموسة من الواجهة ولكن Abstract Factory إرجاع factory of factory. بعبارات أخرى Abstract Factory إرجاع مختلف الجمع بين سلسلة من الواجهة.


آمل أن يكون تفسيري مفيدًا.

الفرق الرئيسي في هذه المصانع هو عندما تريد أن تفعل مع المصانع وعندما تريد استخدامها.

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

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

لذلك ، أعتقد أنه أيضا عن حياة الكائن والخلق.

كلاهما Factory Method و Abstract Factory حافظ على فصل العملاء من أنواع الخرسانة. كلاهما إنشاء كائنات ، ولكن Factory الطريقة تستخدم الميراث بينما Abstract Factory استخدام التكوين.

ال Factory Method ورث في الفئات الفرعية لإنشاء كائنات ملموسة (منتجات) بينما Abstract Factory توفير واجهة لإنشاء عائلة من المنتجات ذات الصلة والفئة الفرعية لهذه الواجهة تحدد كيفية إنشاء منتجات ذات صلة.

ثم يتم تمرير هذه الفئات الفرعية عند إنشاء فئات المنتج حيث يتم استخدامها كنوع مجردة. المنتجات ذات الصلة في Abstract Factory غالبًا ما يتم تنفيذها باستخدام Factory Method.

تمديد إجابة John Feminella:

Apple, Banana, Cherry الأدوات FruitFactory وهذا له طريقة تسمى Create وهو المسؤول الوحيد عن إنشاء التفاح أو الموز أو الكرز. لقد انتهيت مع Factory طريقة.

الآن ، تريد ذلك Create سلطة خاصة من ثمارك وهناك تأتي مصنع مجردة. يعرف المصنع التجريدي كيفية إنشاء سلطتك الخاصة من التفاح والموز والكرز.

public class Apple implements Fruit, FruitFactory {
    public Fruit Create() {
        // Apple creation logic goes here
    }
}

public class Banana implements Fruit, FruitFactory {
    public Fruit Create() {
        // Banana creation logic goes here
    }
}

public class Cherry implements Fruit, FruitFactory {
    public Fruit Create() {
        // Cherry creation logic goes here
    }
}

public class SpecialSalad implements Salad, SaladFactory {
    public static Salad Create(FruitFactory[] fruits) {
        // loop through the factory and create the fruits.
        // then you're ready to cut and slice your fruits 
        // to create your special salad.
    }
}

بحكم التعريف ، يمكننا سحب الاختلافات بين اثنين:

المصنع: يتم استخدام واجهة لإنشاء كائن ، لكن الفئة الفرعية تقرر الفئة التي يجب إنشاءها. يتم إنشاء كائن عندما يكون مطلوبًا.

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

لذلك ، في التعريفات المذكورة أعلاه ، يمكننا التأكيد على اختلاف معين. أي أن نمط المصنع مسؤول عن إنشاء كائنات ومصنع مجردة مسؤول عن إنشاء مجموعة من الكائنات ذات الصلة ؛ من الواضح كلاهما من خلال واجهة.

نمط المصنع:

public interface IFactory{
  void VehicleType(string n);
 }

 public class Scooter : IFactory{
  public void VehicleType(string n){
   Console.WriteLine("Vehicle type: " + n);
  }
 }

 public class Bike : IFactory{
  public void VehicleType(string n) {
  Console.WriteLine("Vehicle type: " + n);
  }
 }

 public interface IVehicleFactory{
  IFactory GetVehicleType(string Vehicle);
 }

 public class ConcreteVehicleFactory : IVehicleFactory{
 public IFactory GetVehicleType(string Vehicle){
   switch (Vehicle){
    case "Scooter":
     return new Scooter();
    case "Bike":
     return new Bike();
    default:
    return new Scooter();
  }
 }

 class Program{
  static void Main(string[] args){
   IVehicleFactory factory = new ConcreteVehicleFactory();
   IFactory scooter = factory.GetVehicleType("Scooter");
   scooter.VehicleType("Scooter");

   IFactory bike = factory.GetVehicleType("Bike");
   bike.VehicleType("Bike");

   Console.ReadKey();
 }
}

نمط المصنع التجريدي:

interface IVehicleFactory{
 IBike GetBike();
 IScooter GetScooter();
}

class HondaFactory : IVehicleFactory{
     public IBike GetBike(){
            return new FZS();
     }
     public IScooter GetScooter(){
            return new FZscooter();
     }
 }
class HeroFactory: IVehicleFactory{
      public IBike GetBike(){
            return new Pulsur();
     }
      public IScooter GetScooter(){
            return new PulsurScooter();
     }
}

interface IBike
    {
        string Name();
    }
interface IScooter
    {
        string Name();
    }

class FZS:IBike{
   public string Name(){
     return "FZS";
   }
}
class Pulsur:IBike{
   public string Name(){
     return "Pulsur";
   }
}

class FZscooter:IScooter {
  public string Name(){
     return "FZscooter";
   }
}

class PulsurScooter:IScooter{
  public string Name(){
     return "PulsurScooter";
   }
}

enum MANUFACTURERS
{
    HONDA,
    HERO
}

class VehicleTypeCheck{
        IBike bike;
        IScooter scooter;
        IVehicleFactory factory;
        MANUFACTURERS manu;

        public VehicleTypeCheck(MANUFACTURERS m){
            manu = m;
        }

        public void CheckProducts()
        {
            switch (manu){
                case MANUFACTURERS.HONDA:
                    factory = new HondaFactory();
                    break;
                case MANUFACTURERS.HERO:
                    factory = new HeroFactory();
                    break;
            }

      Console.WriteLine("Bike: " + factory.GetBike().Name() + "\nScooter: " +      factory.GetScooter().Name());
        }
  }

class Program
    {
        static void Main(string[] args)
        {
            VehicleTypeCheck chk = new VehicleTypeCheck(MANUFACTURERS.HONDA);
            chk.CheckProducts();

            chk= new VehicleTypeCheck(MANUFACTURERS.HERO);
            chk.CheckProducts();

            Console.Read();
        }
    }

تحقق هنا: http://www.allapplabs.com/java_design_patterns/abstract_factory_pattern.htmيبدو أن طريقة المصنع تستخدم فئة معينة (غير مجردة) كطبقة أساسية بينما يستخدم المصنع التجريدي فئة مجردة لهذا الغرض. أيضًا إذا كنت تستخدم واجهة بدلاً من فئة مجردة ، فستكون النتيجة تنفيذًا مختلفًا لنمط المصنع التجريدي.

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

أعتقد أنه يمكننا فهم الفرق بين هذين من خلال رؤية رمز مثال Java8:

  interface Something{}

  interface OneWhoCanProvideSomething {
     Something getSomething();
  }

  interface OneWhoCanProvideCreatorsOfSomething{
     OneWhoCanProvideSomething getCreator();
  }


public class AbstractFactoryExample {

    public static void main(String[] args) {
        //I need something
        //Let's create one
        Something something = new Something() {};

        //Or ask someone (FACTORY pattern)
        OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeA = () -> null;
        OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeB = () -> null;

        //Or ask someone who knows soemone who can create something (ABSTRACT FACTORY pattern)
        OneWhoCanProvideCreatorsOfSomething oneWhoCanProvideCreatorsOfSomething = () -> null;

        //Same thing, but you don't need to write you own interfaces
        Supplier<Something> supplierOfSomething = () -> null;
        Supplier<Supplier<Something>> supplierOfSupplier = () -> null;
    }

}

الآن السؤال هو الطريقة التي يجب أن تستخدمها ولماذا: الطريقة الأولى (لا نمط ، مجرد مُنشئ عادي): إن إنشاء نفسك ليس فكرة جيدة ، وعليك القيام بكل العمل ، ورمز العميل الخاص بك مرتبط به التنفيذ الخاص.

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

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

لاحظ أنه يمكنك دائمًا الابتعاد عن نمط المصنع من خلال الجمع بين شرطين معًا (مما يزيد قليلاً من تعقيد الكود ، والاقتران) ، أعتقد أن هذا هو السبب في أننا نادراً ما نرى حالات استخدام الحياة الحقيقية لنمط المصنع التجريدي.

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