يرجى مراجعة هذه المقالة وإزالة وسم المقالات غير المراجعة، ووسمها بوسوم الصيانة المناسبة.

نمط تصميم الباني

من ويكيبيديا، الموسوعة الحرة
اذهب إلى التنقل اذهب إلى البحث
N write.svg
تعرَّف على طريقة التعامل مع هذه المسألة من أجل إزالة هذا القالب.هذه مقالة غير مراجعة. ينبغي أن يزال هذا القالب بعد أن يراجعها محرر؛ إذا لزم الأمر فيجب أن توسم المقالة بقوالب الصيانة المناسبة. يمكن أيضاً تقديم طلب لمراجعة المقالة في الصفحة المخصصة لذلك. (مايو 2020)

نمط الباني 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[عدل]

نموذج لصنف class UML ومخطط تسلسلي لنمط تصميم البانيBuilder design pattern..[4]

في الرسم التخطيطي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.

انظر أيضا[عدل]

  • الكاري

المراجع[عدل]

  1. أ ب 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. الوسيط |CitationClass= تم تجاهله (مساعدة)صيانة CS1: أسماء متعددة: قائمة المؤلفون (link)
  2. ^ "The Builder design pattern - Problem, Solution, and Applicability". w3sDesign.com. مؤرشف من الأصل في 17 مايو 2020. اطلع عليه بتاريخ 13 أغسطس 2017. الوسيط |CitationClass= تم تجاهله (مساعدة)
  3. أ ب "Index of /archive/2010/winter/51023-1/presentations" (PDF). www.classes.cs.uchicago.edu. مؤرشف من الأصل (PDF) في 17 أغسطس 2016. اطلع عليه بتاريخ 03 مارس 2016. الوسيط |CitationClass= تم تجاهله (مساعدة)
  4. ^ "The Builder design pattern - Structure and Collaboration". w3sDesign.com. مؤرشف من الأصل في 17 مايو 2020. اطلع عليه بتاريخ 12 أغسطس 2017. الوسيط |CitationClass= تم تجاهله (مساعدة)

روابط خارجية[عدل]