---
title: "استبدال الباني بتابع مصنع (Replace Constructor with Factory Method)"
type: "refactoring-technique"
slug: "replace-constructor-with-factory-method"
url: "http://localhost:3000/ar/replace-constructor-with-factory-method.md"
category: "تبسيط استدعاءات الدوال"
description: "المشكلة: لديك باني (Constructor) معقد يقوم بشيء أكثر من مجرد تعيين قيم المعاملات في حقول الكائن. الحل: أنشئ تابعاً مصنعاً (Factory Method) واستخدمه لاستبدال استدعاءات الباني."
languages: ["java", "csharp", "php", "typescript"]
---
# استبدال الباني بتابع مصنع (Replace Constructor with Factory Method)

> المشكلة: لديك باني (Constructor) معقد يقوم بشيء أكثر من مجرد تعيين قيم المعاملات في حقول الكائن. الحل: أنشئ تابعاً مصنعاً (Factory Method) واستخدمه لاستبدال استدعاءات الباني.

## المشكلة

لديك باني (Constructor) معقد يقوم بشيء أكثر من مجرد تعيين قيم المعاملات في حقول الكائن.

## الحل

أنشئ تابعاً مصنعاً واستخدمه لاستبدال استدعاءات الباني.

## دواعي إعادة الهيكلة

السبب الأكثر وضوحاً لاستخدام تقنية إعادة الهيكلة هذه يرتبط بتقنية [استبدال رمز النوع بفئات فرعية (Replace Type Code with Subclasses)](/replace-type-code-with-subclasses).

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

يمكن استخدام التوابع المصنعة في مواقف أخرى أيضاً عندما لا تكون البانيات قادرة على أداء المهمة. ويمكن أن تكون مهمة عند محاولة [تغيير القيمة إلى مرجع (Change Value to Reference)](/change-value-to-reference). كما يمكن استخدامها أيضاً لتعيين أوضاع إنشاء مختلفة تتجاوز عدد وأنواع المعاملات.

## الفوائد

* لا يعيد التابع المصنع بالضرورة كائناً من الفئة التي تم استدعاؤه فيها. غالباً ما تكون الفئات الفرعية لها، والمحددة بناءً على الوسائط الممررة للتابع.
* يمكن أن يحصل التابع المصنع على اسم أفضل يصف ما يفعله وكيف يعيد نتيجته، على سبيل المثال `Troops::GetCrew(myTank)`.
* يمكن للتابع المصنع إعادة كائن تم إنشاؤه بالفعل، على عكس الباني الذي يقوم دائماً بإنشاء نسخة جديدة.

## كيفية إعادة الهيكلة

1. أنشئ تابعاً مصنعاً (Factory method). وضع استدعاءً للباني الحالي بداخله.
2. استبدل جميع استدعاءات الباني باستدعاءات للتابع المصنع.
3. صرح بأن الباني خاص (Private).
4. تفحص كود الباني وحاول عزل الكود غير المرتبط مباشرة بإنشاء كائن من الفئة الحالية، وانقل هذا الكود إلى التابع المصنع.
## Relations

**Helps you do**

- [تغيير القيمة إلى مرجع](/ar/change-value-to-reference.md)
- [استبدال كود النوع بفئات فرعية](/ar/replace-type-code-with-subclasses.md)

## Code Examples

### java

```java
// Before
class Employee {
  Employee(int type) {
    this.type = type;
  }
  // ...
}

// After
class Employee {
  static Employee create(int type) {
    employee = new Employee(type);
    // القيام ببعض العمليات الثقيلة.
    return employee;
  }
  // ...
}
```

### csharp

```csharp
// Before
public class Employee 
{
  public Employee(int type) 
  {
    this.type = type;
  }
  // ...
}

// After
public class Employee
{
  public static Employee Create(int type)
  {
    employee = new Employee(type);
    // القيام ببعض العمليات الثقيلة.
    return employee;
  }
  // ...
}
```

### php

```php
// Before
class Employee {
  // ...
  public function __construct($type) {
   $this->type = $type;
  }
  // ...
}

// After
class Employee {
  // ...
  static public function create($type) {
    $employee = new Employee($type);
    // القيام ببعض العمليات الثقيلة.
    return $employee;
  }
  // ...
}
```

### typescript

```typescript
// Before
class Employee {
  constructor(type: number) {
    this.type = type;
  }
  // ...
}

// After
class Employee {
  static create(type: number): Employee {
    let employee = new Employee(type);
    // القيام ببعض العمليات الثقيلة.
    return employee;
  }
  // ...
}
```

