نمط تصميم الباني
نمط الباني builder pattern هونمط تصميم design patternمصمم لتوفير حل مرن لمشاكل إنشاء الكائناتobject creation problems المختلفة في البرمجة الموجهة للكائناتobject-oriented programming . الغرض من نمط تصميم Builder هو فصل separate بناء كائن معقد عن تمثيله. وهي واحدة من أنماط تصميم عصابة الأربعة Gang of Four design patterns .
نظرة عامة
يعد نمط تصميم Builder أحد أنماط تصميم GoF [1] التي تصف كيفية حل مشكلات التصميم المتكررة recurring design problems في البرامج الموجهة للكائناتobject-oriented software..
يحل نمط تصميم الباني مشاكل مثل:[2]
- كيف يمكن للصنف(كلاس ) class (نفس عملية البناء construction ) إنشاء تمثيلات representations مختلفة لكائن معقدcomplex object؟
- كيف يمكن تبسيط صنف class يتضمن إنشاء كائن معقد؟
إنشاء وتجميع assembling أجزاء كائن معقد مباشرة داخل صنف class أمر غير مرن inflexible . يلزم الصنف بإنشاء تمثيل معين للكائن المعقد ويجعل من المستحيل تغيير التمثيل لاحقًا بشكل مستقل عن (دون الحاجة إلى تغيير) الصنف.
يصف نمط تصميم الباني كيفية حل مثل هذه المشاكل:
- تغليف إنشاء وتجميع أجزاء كائن معقد في كائن
Builder
منفصل. - تفوض فئة إنشاء كائن إلى كائن
Builder
بدلاً من إنشاء الكائنات مباشرة.
يمكن للصنف (نفس عملية البناء) التفويضdelegate لكائنات Builder
المختلفة لإنشاء تمثيلاتrepresentations مختلفة لكائن معقد.
تعريف
الغرض من نمط تصميم Builder هو فصل بناء كائن معقد عن تمثيله. من خلال القيام بذلك، يمكن أن تخلق عملية البناء نفسها تمثيلات مختلفة.[1]
مزايا
تتضمن مزايا نمط الباني ما يلي:[3]
- يسمح لك بتغيير التمثيل الداخلي للمنتجproduct's internal representation.
- تغليف Encapsulates الكود للبناء والتمثيلconstruction and representation.
- يوفر تحكم control على خطوات عملية البناءconstruction process..
سلبيات
تشمل عيوب نمط الباني:[3]
- يتطلب إنشاء باني محدد ConcreteBuilder منفصل لكل نوع type مختلف من المنتجات.
- يتطلب أن تكون أصناف (كلاسات)البانيbuilder قابلة للتغيير mutable.
- قد يكون حقن التبعية Dependency injection أقل دعمًا less supported.
هيكلية Structure
مخطط الصنف UML class Diagram ومخطط التسلسلsequence diagram
في الرسم التخطيطيUML لصنف UML class diagram أعلاه، لا تقوم فئة Director
بإنشاء وتجميع كائنات ProductA1
و ProductB1
مباشرة. بدلاً من ذلك، يشير Director
إلى واجهة Builder
لبناء (إنشاء وتجميع) أجزاء كائن معقد، مما يجعل Director
مستقلًا يتم إنشاء فئات ملموسة منه (أي تمثيل تم إنشاؤه). Builder1
الفئة Builder1
واجهة Builder
عن طريق إنشاء وتجميع كائنات ProductA1
و ProductB1
. يوضح الرسم التخطيطي لتسلسل UML تفاعلات وقت التشغيل: يستدعي كائن Director
buildPartA()
على كائن Builder1
، الذي ينشئ ويجمع كائن ProductA1
. بعد ذلك، يستدعي Director
buildPartB()
على Builder1
، الذي يقوم بإنشاء وتجميع كائن ProductB1
.
مخطط الصنف Class Diagram
- باني
- واجهة مجردة لإنشاء الكائنات (المنتج).
- باني محدد ConcreteBuilder
- يوفر التنفيذ لـلباني Builder. إنه كائن قادر على بناء كائنات أخرى object able to construct other objects. يقوم ببناء وتجميع الأجزاء لبناء الكائنات.
أمثلة
#C
/// <summary>
/// Represents a product created by the builder
/// </summary>
public class Car
{
public string Make { get; set; }
public string Model { get; set; }
public int NumDoors { get; set; }
public string Colour { get; set; }
public Car(string make, string model, string colour, int numDoors)
{
Make = make;
Model = model;
Colour = colour;
NumDoors = numDoors;
}
}
/// <summary>
/// The builder abstraction
/// </summary>
public interface ICarBuilder
{
string Colour { get; set; }
int NumDoors { get; set; }
Car GetResult();
}
/// <summary>
/// Concrete builder implementation
/// </summary>
public class FerrariBuilder : ICarBuilder
{
public string Colour { get; set; }
public int NumDoors { get; set; }
public Car GetResult()
{
return NumDoors == 2 ? new Car("Ferrari", "488 Spider", Colour, NumDoors) : null;
}
}
/// <summary>
/// The director
/// </summary>
public class SportsCarBuildDirector
{
private ICarBuilder _builder;
public SportsCarBuildDirector(ICarBuilder builder)
{
_builder = builder;
}
public void Construct()
{
_builder.Colour = "Red";
_builder.NumDoors = 2;
}
}
public class Client
{
public void DoSomethingWithCars()
{
var builder = new FerrariBuilder();
var director = new SportsCarBuildDirector(builder);
director.Construct();
Car myRaceCar = builder.GetResult();
}
}
يقوم المدير بتجميع assembles مثيل سيارة car instance في المثال أعلاه، وتفويض delegating البناء construction إلى كائن منشئ builder object منفصل تم منحه للمدير من قبل العميل Client.
انظر أيضا
- الكاري
المراجع
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994)، Design Patterns: Elements of Reusable Object-Oriented Software، Addison Wesley، ص. 97ff، ISBN 0-201-63361-2، مؤرشف من الأصل في 17 مايو 2020.
{{استشهاد بكتاب}}
: صيانة CS1: أسماء متعددة: قائمة المؤلفون (link) - "The Builder design pattern - Problem, Solution, and Applicability"، w3sDesign.com، مؤرشف من الأصل في 17 مايو 2020، اطلع عليه بتاريخ 13 أغسطس 2017.
- "Index of /archive/2010/winter/51023-1/presentations" (PDF)، www.classes.cs.uchicago.edu، مؤرشف من الأصل (PDF) في 17 أغسطس 2016، اطلع عليه بتاريخ 03 مارس 2016.
- "The Builder design pattern - Structure and Collaboration"، w3sDesign.com، مؤرشف من الأصل في 17 مايو 2020، اطلع عليه بتاريخ 12 أغسطس 2017.
روابط خارجية
- تعرض مقالة JavaWorld إنشاء واجهات مستخدم بدونgetters and setters واضعات ومستخرجات ( Allen Holub )شفرة مصدرsource code Java الكاملة لمنشئ.
- بوابة علم الحاسوب