1 نظرة عامة
يستخدم نمط البناء (نمط البناء) بشكل أساسي "لبناء كائن معقد خطوة بخطوة"، حيث تكون "خطوة بخطوة" خوارزمية مستقرة، بينما تتغير الأجزاء المختلفة للكائن المعقد بشكل متكرر. لذلك، يتم استخدام نمط المنشئ بشكل أساسي لحل المتطلبات المتغيرة لـ "جزء الكائن". وهذا يسمح بمزيد من التحكم الدقيق في عملية بناء الكائن.
2 أمثلة
بأخذ إنتاج الهواتف المحمولة كمثال، ينقسم كل هاتف محمول إلى شاشة ووحدة المعالجة المركزية والبطارية. الآن هناك نوعان من الهواتف المحمولة التي سيتم إنتاجها، أبل وسامسونج.
تفاحة:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.before.use؛
import java.util.ArrayList;
import java.util.List;
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
الفئة العامة ApplePhone {
List<String> parts = new ArrayList<String>();
الفراغ العام createCPU() {
parts.add("كأس: كوالكوم");
}
الفراغ العام createScreen () {
parts.add("الشاشة: JDI");
}
الفراغ العام createBattery() {
parts.add("البطارية: ديساي");
}
عرض الفراغ العام (){
System.out.print("معلومات مكون المنتج:");
ل(جزء السلسلة: أجزاء){
System.out.print(part + "/t");
}
}
}
سامسونج:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.before.use؛
import java.util.ArrayList;
import java.util.List;
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
فئة عامة SamsungPhone {
List<String> parts = new ArrayList<String>();
الفراغ العام createCPU() {
parts.add("كأس: MTK");
}
الفراغ العام createScreen () {
parts.add("الشاشة: سامسونج");
}
الفراغ العام createBattery() {
parts.add("البطارية: ديساي");
}
عرض الفراغ العام (){
System.out.print("معلومات مكون المنتج:");
ل(جزء السلسلة: أجزاء){
System.out.print(part + "/t");
}
}
}
عميل الاختبار:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.before.use؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
اختبار البناء للفئة العامة {
ApplePhone ثابت خاص iphone = new ApplePhone();
SamsungPhone ثابت خاص samPhone = new SamsungPhone();
الفراغ الثابت العام الرئيسي(String args[]){
iphone.createCPU();
iphone.createScreen();
iphone.createBattery();
iphone.show();
samPhone.createCPU();
samPhone.createScreen();
samPhone.createBattery();
samPhone.show();
}
}
هل وجدت مشكلة؟ أي أن كل عملية لإنتاج الهواتف المحمولة هي نفسها، على وجه الدقة، أسماء العمليات هي نفسها، ولكن المعالجة المحددة لكل عملية تظل دون تغيير معالجة كل تغييرات العملية، من هذا، يمكننا استخراج ما لا يتغير، "غير متغير للتعامل مع جميع التغييرات"، وتسليم التغيير إلى منتجات محددة.
كيف نفعل ذلك على وجه التحديد؟ هذه المرة، يكون وضع Builder مفيدًا.
أولاً، دعونا نلقي نظرة على واجهة الهاتف:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.after.use؛
import java.util.ArrayList;
import java.util.List;
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
هاتف فئة مجردة عامة {
protected List<String> parts = new ArrayList<String>();
إضافة الفراغ العام (جزء السلسلة) {
parts.add(part);
}
عرض الفراغ العام (){
System.out.print("معلومات مكون المنتج:");
ل(جزء السلسلة: أجزاء){
System.out.print(part + "/t");
}
}
}
فئة هواتف أبل المحمولة:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.after.use؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
يمتد ApplePhone من الفئة العامة إلى الهاتف {
}
فئة هواتف سامسونج المحمولة:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.after.use؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
الطبقة العامة SamsungPhone تمتد الهاتف {
}
ثم حدد منشئ الواجهة لخطوة الإنتاج:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.after.use؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
منشئ الواجهة العامة {
بناء الفراغ العام وحدة المعالجة المركزية ()؛
public void buildScreen();
public void buildBattery();
الهاتف العام getPhone();
}
منشئ آيفون:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.after.use؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
الطبقة العامة ApplePhoneBuilder تنفذ Builder {
هاتف هاتف خاص = هاتف ApplePhone جديد ()؛
@تجاوز
بناء الفراغ العام وحدة المعالجة المركزية () {
phone.add("CUP: كوالكوم");
}
@تجاوز
بناء الفراغ العام () {
phone.add("الشاشة: JDI");
}
@تجاوز
بناء البطارية الفراغية العامة () {
phone.add("البطارية: ديساي");
}
@تجاوز
الهاتف العام getPhone() {
هاتف العودة؛
}
}
منشئ للهواتف المحمولة سامسونج:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.after.use؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
الطبقة العامة SamsungPhoneBuilder تنفذ Builder {
هاتف هاتف خاص = هاتف SamsungPhone جديد ()؛
@تجاوز
بناء الفراغ العام وحدة المعالجة المركزية () {
phone.add("كأس: MTK");
}
@تجاوز
بناء الفراغ العام () {
phone.add("الشاشة: سامسونج");
}
@تجاوز
بناء البطارية الفراغية العامة () {
phone.add("البطارية: ديساي");
}
@تجاوز
الهاتف العام getPhone() {
هاتف العودة؛
}
}
المدير الذي يوجه الإنتاج المحدد للهواتف المحمولة:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.after.use؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
مدير الطبقة العامة {
منشئ البناء الخاص؛
المدير العام (باني البناء) {
this.builder = builder;
}
بناء الفراغ العام () {
builder.buildCPU();
builder.buildScreen();
builder.buildBattery();
}
}
أخيرًا اكتب فئة اختبار:
انسخ رمز الكود كما يلي:
الحزمة org.scott.builder.after.use؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-20
* @وصف
*/
اختبار البناء للفئة العامة {
Private static Builder iPhoneBuilder = new ApplePhoneBuilder();
منشئ ثابت خاص samPhoneBuilder = new SamsungPhoneBuilder();
public static void main(String[] args) {
المخرج Director = new Director(iPhoneBuilder);
Director.construct();
هاتف الهاتف = iPhoneBuilder.getPhone();
System.out.println("iphone");
phone.show();
Director = new Director(samPhoneBuilder);
Director.construct();
phone = samPhoneBuilder.getPhone();
System.out.println("/nsamSung");
phone.show();
}
}
نتائج التشغيل:
انسخ رمز الكود كما يلي:
ايفون
معلومات جزء المنتج: الكأس: شاشة كوالكوم: بطارية JDI: DeSai
سامسونج
معلومات جزء المنتج: الكأس: شاشة MTK: بطارية سامسونج: DeSai
فئتا كيانات الهاتف هنا فارغة إذا كان الأمر كذلك، فيمكن حذفهما إذا كان من الممكن أيضًا حذف واجهة الهاتف، ولم يتبق سوى فئات تنفيذ المدير والمنشئ والمنشئ المحدد. علاوة على ذلك، فإن فئة ApplePhone وفئة SamsungPhone هما فئتان مرتبطتان، وهما علامتان تجاريتان مختلفتان للهواتف المحمولة. إذا واجهت فئتين أو أكثر غير مرتبطتين كثيرًا، فليست هناك حاجة لوجود واجهة الهاتف العامة فكيف يمكن تحديد القيمة المرجعة لطريقة getPhone () المحددة في واجهة Builder؟
بغض النظر عما إذا كان نوع قيمة الإرجاع هو ApplePhone أو SamsungPhone، فستنشأ مشاكل لأن أنواع النتائج التي يتم إرجاعها ليست موحدة. في هذا الوقت، يمكن تعريف الهاتف على أنه واجهة فارغة (واجهة لا تحتوي على أي طرق)، ثم السماح لفئات المنتجات المحددة التي ليس لها علاقة مع بعضها البعض بتنفيذ هذه الواجهة، ثم نوع قيمة الإرجاع لـ getPhone(. ) الطريقة المحددة في واجهة Builder لا تزال من نوع الهاتف، مما يحل المشكلة. ومع ذلك، في هذه الحالة، ليست هناك حاجة لاستخدام وضع Builder.