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

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

روابط خارجية

  • بوابة علم الحاسوب
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.