اضطررت إلى كتابة هذا المقال لسببين. في الآونة الأخيرة ، التقيت بنمط مصنع الخلاصة. كما يقول المثل - "لا أعرف كيف تفعل ذلك بنفسك ، وتعليم صديق". من المعروف أن أحد أفضل الطرق لتوحيد المواد هو شرح شخص تمت دراسته مسبقًا. السبب الثاني - في عملية دراسة هذا النمط ، لم أحصل على مواد توضح لي شخصيا بوضوح جوهر مصنع المستخلص (على الأقل في حبري).
لذلك دعونا نبدأ. السؤال الأول الذي تحتاجه للإجابة على نفسك من خلال دراسة هذا النمط: "ما هو مصنع الملخص". الجواب الأبسط والأكثر دقة هو أن مصنع الخلاصة هو "مصنع للمصانع". ولكن هنا يظهر السؤال الثاني: "لماذا يحتاج أي شخص حتى إلى" مصنع للمصانع "؟ للإجابة عليه ، فكر في مثال من واقع الحياة.
لنفترض أنك قررت السيطرة الكاملة على سوق السيارات. كيف نفعل ذلك؟ يمكنك إنشاء ماركة سيارتك الخاصة ، وإنتاجك ، وإدارة شركة إعلانية واسعة النطاق ، إلخ. لكن ، في هذه الحالة ، عليك أن تقاتل مع عمالقة سوق السيارات مثل تويوتا أو فورد. ليست حقيقة أنك ستخرج منتصرة من هذا الصراع. سيكون الحل الأفضل هو شراء مصانع جميع هذه الشركات ، ومواصلة إنتاج السيارات تحت علاماتها التجارية ، وتحقيق الربح في جيبك. إذا لم أكن مخطئا ، فإن مثل هذا الهيكل في الاقتصاد يسمى - القابضة. سيكون هذا المصنع هو المصنع التجريدي أو "مصنع المصانع". في برنامجنا ، سيتم تمثيل مصنع الملخص (قابض) بواجهة أو فئة مجردة. يتم تمثيل الشركات المدرجة في الحصة بفئات تنفذ هذه الواجهة.
public interface CarsFactory { } public class ToyotaFactory implements CarsFactory {} public class FordFactory implements CarsFactory {}
بعد ذلك ، تقوم بجمع مديري المصانع الخاصة بك وتقول: "من الآن فصاعدًا ، سنصنع سيارات بنوعين من الجسد في مصانعنا - سيارة سيدان وكوبيه. على سبيل المثال ، سيفعل اليابانيون ToyotaSedan و ToyotaCoupe ، وسيعمل الأمريكيون FordSedan و FordCoupe. " وحتى لا تنسى المصانع ما يجب القيام به بالضبط ، ولا تبدأ ، على سبيل المثال ، سيارات الدفع الرباعي ، فإننا سنعلق الرسومات العامة لسيارة السيدان وكوبيه في مكتبنا في مكان بارز (في مصنع معين ، سيتعرف المهندسون على كيفية صنع السيارات التي يحتاجون إليها). وبالتالي ، تظهر طريقتان في واجهة CarsFactory الخاصة بنا:
public interface CarsFactory { Sedan createSedan(); Coupe createCoupe(); }
وفقًا لذلك ، في الفئات الفرعية لواجهة CarsFactory ، يجب أيضًا تنفيذ هذه الطرق.
public class ToyotaFactory implements CarsFactory { @Override public Sedan createSedan() { return new ToyotaSedan(); } @Override public Coupe createCoupe() { return new ToyotaCoupe(); } } public class FordFactory implements CarsFactory { @Override public Sedan createSedan() { return new FordSedan(); } @Override public Coupe createCoupe() { return new FordCoupe(); } }
لاحظ أن نوع القيمة المرجعة في الطرق سيكون بالضبط النوع المشترك لقيم الإرجاع - سيدان وكوبيه. بالعودة إلى قياسنا - أخبرت المصنع أن تصنع سيارة سيدان - حصلت على سيارة سيدان. الميزات ، مثل سيارة السيدان فورد ، ليست ذات أهمية بالنسبة لك.
كما يمكنك أن تخمن بسهولة من الكود أعلاه ، يجب أن تظهر بعض الكيانات في برنامجنا الذي يصف أنواع الجسم المحددة - سيارة سيدان وكوبيه. هذه الكيانات ستكون واجهات.
public interface Sedan {} public interface Coupe {}
وبالطبع ، يجب أن تحتوي هذه الرسومات على تجسيد محدد في شكل سيارات تم إنشاؤها في مصنع معين.
public class ToyotaCoupe implements Coupe { public ToyotaCoupe() { System.out.println("Create ToyotaCoupe"); } } public class ToyotaSedan implements Sedan { public ToyotaSedan() { System.out.println("Create ToyotaSedan"); } } public class FordCoupe implements Coupe { public FordCoupe () { System.out.println("Create FordCoupe"); } } public class FordSedan implements Sedan { public FordSedan() { System.out.println("Create FordSedan"); } }
هذا كل شيء ، "مصنع المصانع" لدينا قادر على إنتاج سيارات من أي علامة تجارية وأي نوع جاهز. في المستقبل ، قد تقرر أنه سيكون من الجيد البدء في إنتاج سيارات الدفع الرباعي. ستحتاج إلى إنشاء واجهة أخرى ، وتعليق رسم لسيارة دفع رباعي في مكتب الشركة القابضة (أضف الطريقة المطلوبة إلى CarsFactory وتنفيذها في المصانع الفرعية). من الممكن أيضًا أن تقرر التقاط قطعة أخرى من السوق وشراء ، على سبيل المثال ، جميع مصانع نيسان. هذا يعني أنك بحاجة إلى إنشاء فصل آخر ينفذ CarsFactory - NissanFactory ، وابدأ في إنتاج سياراتك تحت هذه العلامة التجارية (NissanCoupe ، NissanSedan ، إلخ.)
لكن كيف سيتفاعل مستخدم معين (مشتر سيارة) مع حيازتنا؟ لا يعرف المشتري عمومًا أنك قد استولت على جميع مصانع السيارات في العالم. لقد جاء إلى المكتب الصغير المتواضع للعقد ويقول: "أحتاج سيارة!" "! ممتاز" - أخبرناه - "لقد خاطبت العنوان! مصنع المصانع هو ما تحتاجه! "
CarsFactory factory;
"ما هي شركة السيارات التي تفضلها في هذا الوقت من اليوم؟" ، نسأل. لنفترض أن العميل يريد شراء سيارة تويوتا. لا مشكلة!
factory = new ToyotaFactory();
"أي نوع من الجسم تريد؟" دعنا نقول سيدان. "خيار رائع!"
factory.createSedan();
السيارة جاهزة ، يمكنك الذهاب!