Builder: فصل بناء كائن معقد عن تمثيله ، بحيث يمكن لعملية البناء نفسها إنشاء تمثيلات مختلفة.
استخدم السيناريوهات:
مخطط الطبقة العامة:
على سبيل المثال: توجد العديد من الأجهزة في حياتنا في شكل التجميع ، مثل أجهزة الكمبيوتر المكتبية. سيقوم بعض الشركات المصنعة بتشغيل بعض مضيفي الكمبيوتر المجمعة مع تكوينات افتراضية (يمكن استخدام وضع طريقة القالب هنا). يمكن للعملاء شراء المنتجات ذات التكوينات الافتراضية ، أو يمكنهم مطالبة الشركات المصنعة بإعادة تجميع مضيف مع تكوينات مختلفة وطرق التجميع. في هذه المرحلة ، يمكننا استخدام نموذج البناء لتلبية متطلبات العملاء الخاصين.
لاحظ أنه في هذا المثال ، تقوم الشركة المصنعة بإعادة تجميع المضيف ، أي أن التركيز على كل مكون من مكونات المضيف ، والذي يتماشى مع سيناريو الاستخدام الذي قدمه وضع البناء أعلاه.
تطبيق الكود البسيط هو كما يلي:
// فئة المنتج الملخص ، باستخدام وضع طريقة القالب ، فإن المنتجات المختلفة لها "جزء مكون" مختلف مجردة الفئة الملخص {محمية باختصار void part01 () ؛ محمي باطل باطل part02 () ؛ محمي باطل باطل part03 () ؛ // طريقة القالب تعطي طريقة التجميع الافتراضية ، مما يولد المنتج الافتراضي النهائي المجردة ProctureProduct () {part01 () ؛ part02 () ؛ part03 () ؛ إرجاع هذا ؛ // إرجاع الكائن الحالي ، أي أن المنتج مع طريقة التجميع الافتراضية}} // منتجات محددة A و B ، تقوم منتجات مختلفة بتطبيق "جزء مكون" مختلف "concreteproducta class". } void part02 () {system.out.println ("المنتج A: part02 () ...") ؛ } void part03 () {system.out.println ("المنتج A: part03 () ...") ؛ }} class concreteproductb يمتد مجردة {محمية void part01 () {system.out.println ("المنتج B: part01 () ...") ؛ } void part02 () {system.out.println ("المنتج B: part02 () ...") ؛ } void part03 () {system.out.println ("المنتج B: part03 () ...") ؛ }} // Builder Abstract ، يقوم بصياغة طريقة التركيبة التي يجب على كل منتج تنفيذ BuildPart () ومعايير لإنتاج BuildProduct () class class AbstractBuilder {public Abstract void buildpart () ؛ Public Abstract ProcciretProduct BuildProduct () ؛ } / * * إذا لم يكن المنشئ المحدد غير راضٍ عن المنتج الافتراضي (أي عندما تسمى طريقة الافتراضية () في المنتج التجريدي) ، * لا يمكنك الاتصال به للحصول على المنتج ، ولكن استخدام المنشئ المحدد لتغيير طريقة الإنتاج والتجميع للمنتجات المختلفة * / class concretybuildera يوسع الملخص {prossectionproductaproducta ؛ public void buildpart () {this.producta.part03 () ؛ this.producta.part02 () ؛ this.producta.part01 () ؛ } Public AbstractProduct BuildProduct () {return this.producta ؛ }} class concreteBuilderB يمتد AbstractBuilder {private AbstractProduct ProductB = new concreteproductb () ؛ public void buildpart () {this.productb.part02 () ؛ this.productb.part01 () ؛ // تم حذف مكون واحد في المنتج B ، على سبيل المثال ، لا يلزم عملاء هذا الجزء // this.productb.part03 () ؛ } Public AbstractProduct BuildProduct () {return this.productB ؛ }} // Class Director ، The Builder الذي يمسك بكل منتج مسبقًا ، يوفر طرق تجميع مختلفة للمستخدمين الذين يحتاجون إلى منتجات مختلفة عن Director Director {private ustrultbuilder builda = new ConcreteBuildera () ؛ Private AbstractBuilder BuildB = New ConcreteBuilderB () ؛ Public AbstractProduct getProducta () {this.buildera.buildpart () ؛ إرجاع this.buildera.buildproduct () ؛ } Public AbstractProduct getProductB () {this.builderb.buildpart () ؛ إرجاع this.builderb.buildproduct () ؛ }} // اختبار الفئة العامة العميل {public static void main (string [] args) {system.out.println ("استخدم وضع طريقة القالب للحصول على المنتج الافتراضي A") ؛ AbstractProduct DefaultProducta = concreteproducta (). defaultProduct () ؛ System.out.println ("/NUSE Director Class للحصول على المنتج A مع طرق تجميع مختلفة") ؛ مدير المدير = مدير جديد () ؛ Director.getProducta () ؛ System.out.println ("/NUSE Director Class للحصول على المنتج B مع طرق تجميع مختلفة") ؛ Director.getProductB () ؛ }} نتائج الاختبار:
استخدم وضع طريقة القالب للحصول على المنتج الافتراضي أ
المنتج أ: part01 () ...
المنتج أ: part02 () ...
المنتج أ: part03 () ...
استخدم فئة المخرج للحصول على منتجات ذات طرق تجميع مختلفة أ
المنتج أ: part03 () ...
المنتج أ: part02 () ...
المنتج أ: part01 () ...
استخدم فئة المخرج للحصول على المنتج B مع طرق تجميع مختلفة
المنتج ب: part02 () ...
المنتج ب: part01 () ...
في الواقع ، في هذا المثال ، تستخدم فئة المنتج وضع طريقة القالب المذكور في المقالة السابقة ، أي DefaultProduct () يوفر طريقة لتجميع مكون افتراضي للمنتج.
لكن لدي سؤال هنا. إن طريقة التجميع الافتراضية المزعومة المقدمة في فئة المنتجات التجريدية بناءً على نمط طريقة القالب هي فقط طباعة بعض جمل الاختبار ، ولا تُرجع منتجًا معينًا بالفعل. ومع ذلك ، لا أعرف ما إذا كانت طريقة المعالجة لإعادة كائن الحالي (إرجاع هذا ؛) في المثال أعلاه معقول؟
بالإضافة إلى ذلك ، بعد كتابة هذه المقالات حول تنفيذ أنماط التصميم مع كود Java ، وجدت أن نمط منشئ البناء هذا يبدو أنه يجمع بين نمط المصنع التجريدي ونمط طريقة القالب. لقد ذكرت الفقرة أعلاه بالفعل شكوكي. بالنسبة لنموذج المصنع التجريدي ، أعتقد شخصياً أن فئة المخرج في مثال الكود أعلاه تشبه إلى حد كبير فئة المصنع المحددة للمصنع التجريدي ، ولكن يتعين على فئة المدير أيضًا بناء طريقة تجميع المنتج قبل إرجاع المنتج. ربما يكون هذا "البناء" هو الذي يجعل نموذج البناء يركز على تجميع أجزاء مختلفة من المنتج ، بينما يركز نموذج المصنع التجريدي فقط على توليد منتج نهائي.
لقد قرأت جملة من قبل وقلت إنه يقال تقريبًا: إذا كان من الصعب حل أي مشكلة في الكمبيوتر ، فيمكن معالجةها بإضافة طبقة وسيطة. الآن بعد أن فكرت في الأمر ، يبدو أن كلا من المصنع التجريدي ووضع البناء يستخدمان هذا "المبدأ" لتحقيق التأثير المطلوب. على سبيل المثال ، هناك فئة مصنع مجردة في المصنع التجريدي ، وهناك فئة المخرج في البناء. في التحليل النهائي ، يكون تغليف وإخفاء بعض التفاصيل ويفصلها عن التنفيذ والاستخدام.
أعتقد أنه يجب عليك أولاً فهم المخاوف والسيناريوهات المعمول بها لكل نموذج قبل أن تتمكن من فهمها بشكل أفضل.
ربما تكون هذه الأوضاع كلها أوضاعًا إبداعية وليس لدي أي تجربة عملية ، مما يجعلني أشعر بالارتباك قليلاً حول هذه ... أنا لست خائفًا ، وأفكر قليلاً في عملية تنفيذها جميعًا ، وتطبيقها ببطء على الواقع يجب أن يفهم تدريجياً.
ما سبق هو كل شيء عن هذا المقال ، وآمل أن يلهمك أن تتعلم.