وضع البناء
ويسمى التعريف أيضا نمط المولد. يمكن أن تتجاهل عملية بناء الكائنات المعقدة (الفئات التجريدية) ، بحيث يمكن لطرق التنفيذ المختلفة لهذه العملية التجريدية بناء كائنات ذات مظاهر مختلفة (السمات).
عندما تكون خوارزمية لإنشاء كائن معقد يجب أن تكون مستقلة عن مكونات هذا الكائن ، ويجب أن تسمح عملية البناء للكائن المبني أن يكون له تمثيلات مختلفة. قد نفكر في استخدام وضع البناء.
ينجز
1. Builder يحدد واجهة مجردة لكل مكون ينشئ كائن منتج. عادةً ما يحتوي على طرق مجردة تنشئ المنتجات وإرجاعها ، أو يمكن أن تكون طريقة ملموسة ، مما يضع عملية الإنشاء في فئة ConcreteBuilder.
2. ينفذ ConcreteBuilder واجهة البناء لبناء وتجميع مكونات مختلفة من المنتج.
3. المدير مسؤول عن الاتصال بالمنشئ المناسب لتشكيل المنتج. لا تعتمد فئة المخرج عمومًا على فئة المنتج. تتفاعل فئة البناء مباشرة مع فئة المخرج.
4. يمثل المنتج كائنًا معقدًا ليتم بناؤه. يخلق ConcreateBuilder تمثيلًا داخليًا للمنتج ويحدد عملية التجميع.
/ ** "منتج"*/ class pizza {private string scough = "" ؛ صلصة السلسلة الخاصة = "" ؛ سلسلة خاصة تتصدر = "" ؛ public void setDough (string gough) {this.dough = scough ؛ } public void setSauce (STRING SAUCE) {this.sauce = sauce ؛ } public void settopping (String topping) {this.topping = topping ؛ }} ''/** "Builder Abstract"*/'' class class pizzabuilder {pizza pervected pizza ؛ البيتزا العامة getPizza () {return pizza ؛ } public void createNewPizzaproduct () {pizza = new pizza () ؛ } public builddoughbough () ؛ public buildsauce التجريدي التجريدي () ؛ التجريد الجمهور باطل البناء () ؛ } / ** "ConcreteBuilder"* / Class Hawaiianpizzabuilder يمتد Pizzabuilder {public void buildDough () {pizza.setDough ("cross") ؛ } public void buildsauce () {pizza.setsauce ("mild") ؛ } public void buildTopping () {pizza.settopping ("ham+paneaple") ؛ }} / ** "ConcreteBuilder"* / class spicypizzabuilder يمتد pizzabuilder {public void builddough () {pizza.setDough ("pan baked") ؛ } public void buildsauce () {pizza.setsauce ("hot") ؛ } public void buildTopping () {pizza.settopping ("pepperoni+salami") ؛ }} ''/** "Director"*/'' Class Waiter {private pizzabuilder pizzabuilder ؛ public void setpizzabuilder (pizzabuilder pb) {pizzabuilder = pb ؛ } Public Pizza getPizza () {return pizzabuilder.getPizza () ؛ } public void constructPizza () {pizzabuilder.createNewPizzaproduct () ؛ pizzabuilder.buildDough () ؛ pizzabuilder.buildsauce () ؛ pizzabuilder.buildTopping () ؛ }} /** عميل يطلب بيتزا. */ class builderexample {public static void main (string [] args) {waiter waiter = new wauther () ؛ Pizzabuilder Hawaiian_pizzabuilder = New Hawaiianpizzabuilder () ؛ pizzabuilder spicy_pizzabuilder = جديد spicypizzabuilder () ؛ Waiter.setPizzabuilder (Hawaiian_pizzabuilder) ؛ WAINER.CONSTRUCTPIZZA () ؛ بيتزا بيتزا = waiter.getPizza () ؛ }}يقوم العميل بإنشاء كائن المخرج ويقوم بتكوينه باستخدام كائن البناء الذي يريده. يحصل المدير على طلب العميل لإنشاء المنتج وأخيراً يحصل على المنتج.
ميزة
1. يمكن التحكم بعناية في عملية بناء الكائنات لإنتاج كائنات منتج مختلفة.
2. من السهل التوسع. عندما يكون هناك منتج جديد ، يمكنك فقط إضافة ConcreteBuilder لتحقيقه.
يشبه نمط المصنع المجردة النمط ذي الصلة المولدات لأنه يمكن أيضًا إنشاء كائنات معقدة. الفرق الرئيسي هو أن نمط المولد يركز على بناء كائن معقد خطوة بخطوة. يركز نموذج المصنع التجريدي على سلسلة متعددة من كائنات المنتج (بسيطة أو معقدة).
يقوم المولد بإرجاع المنتج في الخطوة الأخيرة ، وبالنسبة للمصنع التجريدي ، يعود المنتج على الفور.
وضع النموذج الأولي
تحديد نمط النموذج الأولي هو نوع من نمط الإنشاء ، يتميز بـ "نسخ" مثيل موجود لإرجاع مثيل جديد ، بدلاً من إنشاء مثيل جديد. المثال المنسق هو ما نسميه "النموذج الأولي" ، وهو أمر قابل للتخصيص.
يتم استخدام وضع النموذج الأولي في الغالب لإنشاء مثيلات معقدة أو تستغرق وقتًا طويلاً ، لأنه في هذه الحالة ، فإن نسخ مثيل موجود يجعل البرنامج يعمل بشكل أكثر كفاءة ؛ أو إنشاء قيم متساوية ، فقط تسمية بيانات مماثلة مختلفة.
ينجز
1. العميل - إنشاء كائن جديد ثم احصل على كائن آخر من خلال استنساخ.
2. النموذج الأولي - تحديد طريقة الاستنساخ التجريدية الخاصة.
3. النمط concreteprototype - تنفيذ طريقة استنساخ.
الواجهة العامة النموذج الأولي {Public Abstract Object Clone () ؛ } الفئة العامة concreteprototype تنفذ النموذج الأولي {كائن عام clone () {return super.clone () ؛ }} client client {public static void main (string arg []) {concreteprototype obj1 = new concreteprototype () ؛ concreteprototype obj2 = concreteprototype) obj1.clone () ؛ }} مثال
1. تتكرر العديد من العناصر في اللعبة ، ويمكننا استخدام وضع النموذج الأولي لنسخ العناصر نفسها.
2. عند إنشاء مخططات البيانات ، في المرة الأولى التي نحتاج فيها إلى قراءة البيانات من قاعدة البيانات وحفظها في الكائن. عندما نحتاج إلى إنشاء مخططات أخرى لنفس البيانات ، يمكن أن يؤدي استخدام وضع النموذج الأولي إلى تجنب إعادة قراءة قاعدة البيانات.
الأسئلة والتطبيقات ذات الصلة
1. إذا لم يتم إصلاح عدد النماذج الأولية التي سيتم إنشاؤها ، فيمكنك إنشاء مدير نموذج أولي. قبل نسخ كائن النموذج الأولي ، يتحقق العميل أولاً ما إذا كانت هناك كائنات نموذجية تلبي الشروط في مدير النموذج الأولي. إذا كان هناك ، فسيستخدمه مباشرة. إذا لم يكن كذلك ، استنساخ واحد. وهذا ما يسمى نموذج التسجيل لوضع النموذج الأولي.
2. هناك نوعان من النسخ: نسخة عميقة ونسخة ضحلة. عند النسخ ، يشارك كائن النسخ وكائن النموذج الأولي جميع المتغيرات الداخلية للكائن ، والكائنان لهما نفس مساحة الذاكرة ودورة الحياة. تعديل كائن النموذج الأولي يعدل أيضًا نسخة طبق الأصل والعكس.
في Java ، طالما قمت بتنفيذ الواجهة المستنسخة ، يمكنك استدعاء طريقة استنساخ فئة الكائن لتحقيق النسخ الضحل:
الطبقة العامة الضحلة تنفذ استنساخ {int age ؛ شخص public void setage (int age) {this.age = age ؛ } public void setPerson (اسم السلسلة) {person = new شخص (name) ؛ } كائن عام clone () يلقي clonenotsupportedException {// Java الافتراضي ينفذ نسخة ضحلة الإرجاع super.clone () ؛ }} الفئة العامة شخص {string name ؛ الشخص العام (اسم السلسلة) {this.name = name ؛ }} اختبار الفئة العامة {public static void main (string [] args) يلقي clonenotsupportedException {alghlowclone oldshallowclone = new alganwclone () ؛ oldshallowclone.setage (20) ؛ oldshallowclone.setperson ("eric") ؛ System.out.println ("Oldname:" + oldshallowclone.person.name + "العمر:" + oldshallowclone.age) ؛ alganowclone newshallowclone = (alganowclone) oldshallowclone.clone () ؛ System.out.println ("NewName:" + NewShallowClone.person.name + "Age:" + NewShallowClone.age) ؛ oldshallowclone.age = 30 ؛ oldshallowclone.person.name = "Frank" ؛ System.out.println ("NewName:" + NewShallowClone.person.name + "Age:" + NewShallowClone.age) ؛ }} الإخراج:
Oldname: Eric Age: 20NewName: Eric Age: 20NewName: Frank Age: 20
يمكن ملاحظة أن نسخ الكائن هو إشارة إلى الكائن. عندما يتم تغيير قيمة الكائن ، سيتغير الكائن النسخ أيضًا ، والنوع الأساسي من Java هو القيمة المنسوخة.
أدناه ننفذ نسخة عميقة:
الطبقة العامة deepclone {int age ؛ شخص public void setage (int age) {this.age = age ؛ } public void setPerson (اسم السلسلة) {person = new شخص (name) ؛ } public deepclone (deepclone deepclone) {this.age = deepclone.age ؛ this.person = شخص جديد (deepclone.person.name) ؛ } public deepclone () {} كائن عام clone () يلقي clonenotsupportedException {return new deepclone (this) ؛ }} اختبار الفئة العامة {public static void main (string [] args) يرمي clonenotsupportedException {deepclone olddeepclone = new deepclone () ؛ olddeepclone.setage (20) ؛ OldDeepclone.setperson ("eric") ؛ System.out.println ("Oldname:" + OlddeepClone.person.name + "Age:" + OldDeepClone.age) ؛ deepclone newdeepclone = (deepclone) olddeepclone.clone () ؛ System.out.println ("NewName:" + newDeepClone.person.name + "Age:" + NewDeepClone.age) ؛ olddeepclone.age = 30 ؛ olddeepclone.person.name = "Frank" ؛ System.out.println ("NewName:" + newDeepClone.person.name + "Age:" + NewDeepClone.age) ؛ }} الإخراج:
Oldname: Eric Age: 20NewName: Eric Age: 20NewName: Eric Age: 20
في طريقة النسخ أعلاه ، قمنا بإعادة إنشاء كائن وأعادنا إنشاء المرجع لتنفيذ نسخة عميقة.
ميزة
1. النسخ أفضل من الجديد.
2. تبسيط أو إخفاء تفاصيل إنشاء الكائنات ونسخها مباشرة.