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

**نمط الباني** **builder pattern** هو نمط تصميم مصمم لتوفير حل مرن لمشاكل إنشاء الكائنات البرمجبة المختلفة في برمجة كائنية التوجه. الغرض من نمط تصميم الباني هو *فصل الاهتمامات* seperate of concerns بناء كائن معقد عن تمثيله. وهي واحدة من أنماط تصميم عصابة الأربعة .

## نظرة عامة
يعد نمط تصميم الباني أحد *[[نماذج التصميم (هندسة البرمجيات)|أنماط تصميم GoF]]*  التي تصف كيفية حل مشكلات التصميم المتكررة في البرامج كائنية التوجه.

يحل نمط تصميم الباني مشاكل مثل:

* كيف يمكن للصنف  (عملية البناء الذاتية construction ) إنشاء *تمثيلات representations* مختلفة لكائن؟
* كيف يمكن تبسيط صنف يتضمن إنشاء كائن معقد؟

إنشاء وتجميع أجزاء كائن معقد مباشرة داخل صنف أمر غير مرن. يلزم الصنف بإنشاء تمثيل معين للكائن المعقد ويجعل ذلك من المستحيل تغيير التمثيل لاحقًا بشكل مستقل عن (دون الحاجة إلى تغيير) الصنف.

يصف نمط تصميم الباني كيفية حل مثل هذه المشاكل:

* تغليف إنشاء وتجميع أجزاء كائن معقد في كائن `Builder` منفصل.
* تفوض صنف إنشاء كائن إلى كائن `Builder` بدلاً من إنشاء الكائنات مباشرة.

يمكن للصنف (عملية البناء الذاتية) التفويض لكائنات `Builder` المختلفة لإنشاء تمثيلات مختلفة لكائن معقد.

## تعريف
الغرض من نمط تصميم الباني هو فصل بناء كائن معقد عن تمثيله. من خلال القيام بذلك، يمكن أن تخلق عملية البناء نفسها تمثيلات مختلفة.

## مزايا
تتضمن مزايا نمط الباني ما يلي:

* يسمح لك بتغيير التمثيل الداخلي للمنتج.
* تغليف الكود للبناء والتمثيل.
* يوفر تحكم على خطوات عملية البناء.

## سلبيات
تشمل عيوب نمط الباني:

** يتطلب إنشاء باني محدد ConcreteBuilder منفصل لكل نوع برمجي مختلف من المنتجات.
** يتطلب أن تكون أصناف (كلاسات)الباني قابلة للتغيير.
** قد يكون حقن التبعية أقل دعمًا.

## هيكل

### [[مخطط الفئة|مخطط الصنف]] و<nowiki/>[[مخطط التتابع|مخطط التسلسل]]
بدون|إطار| مخطط لصنف ومخطط تسلسلي لنمط تصميم الباني
في الرسم التخطيطي  للصنف  في مخطط الصنف أعلاه، لا يقوم الصنف `Director` بإنشاء وتجميع كائنات `ProductA1` و `ProductB1` مباشرة. بدلاً من ذلك، يشير `Director` إلى واجهة `Builder` لبناء (إنشاء وتجميع) أجزاء كائن معقد، مما يجعل `Director` مستقلًا يتم إنشاء أصناف محددة منه (أي تمثيل تم إنشاؤه). الصنف `Builder1` واجهة `Builder` عن طريق إنشاء وتجميع كائنات `ProductA1` و `ProductB1` . يوضح الرسم التخطيطي المتتابع تفاعلات وقت التشغيل: يستدعي كائن `Director` `buildPartA()` على كائن `Builder1` ، الذي ينشئ ويجمع كائن `ProductA1` . بعد ذلك، يستدعي `Director` `buildPartB()` على `Builder1` ، الذي يقوم بإنشاء وتجميع كائن `ProductB1` .

### [[مخطط الفئة|مخطط الصنف]]
مركز|500x500بك| هيكل البناء

; باني
: واجهة مجردة لإنشاء الكائنات (المنتج).

; باني محدد ConcreteBuilder
: يوفر التنفيذ لـلباني Builder. إنه كائن قادر على بناء كائنات أخرى. يقوم ببناء وتجميع الأجزاء لبناء الكائنات.

## أمثلة

### سي شارب

```csharp
/// يمثل منتج مُنشأ بواسطة الباني 
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;
  }
}

/// تجريد الباني

public interface ICarBuilder
{
  string Colour { get; set; }
  int NumDoors { get; set; }

  Car GetResult();
}

/// تنفيد محدد للباني
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;    
  }
}

///  المدير

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();
  }
}
```


## المراجع

* 

تصنيف:نماذج تصميم البرمجيات