في **البرمجة القائمة على الأصناف**، يعد **نمط طريقة المصنع (بالإنجليزية: factory method pattern)‏ نمطًا** انشائياً (اي الأنماط المسؤولة عن انشاء كائنات) يستخدم طرق المصنع للتعامل مع مشكلة إنشاء الكائنات دون الحاجة إلى تحديد صنف الكائن الذي سيتم إنشاؤه بالضبط. يتم ذلك بواسطة إنشاء كائنات عن طريق استدعاء **طريقة المصنع** - إما محدد في واجهة ويتم تنفيذه بواسطة اصناف فرعية، أو يتم تنفيذه في صنف أساسي ويتم تجاوزه اختياريًا بواسطة الاصناف المشتقة - بدلاً من استدعاء مُنشئ.

نظرة عامة
---------

يعد نمط تصميم طريقة المصنع  أحد *أنماط التصميم "عصابة الأربعة"* التي تصف كيفية حل مشكلات التصميم المتكررة لتصميم برامج مرنة وكائنية التوجه قابلة لإعادة الاستخدام، أي الكائنات التي يسهل تنفيذها أو تغييرها أو اختبارها، وإعادة استخدامها.

يتم استخدام نمط (تصميم) طريقة المصنع بدلاً من مُنشئ الصنف العادي للاحتفاظ بمبدأ SOLID للبرمجة، وفصل بناء الكائنات عن الكائنات نفسها. هذه الفكرة لها مزايا ومفيدة للحالات التالية، من بين أمور أخرى:

* يسمح ببناء الاصناف بمكون من نوع برمجي لم يتم تحديده مسبقًا، ولكن يتم تعريفه فقط في «واجهة» أوا الواجهة، التي يتم تعريفها على أنها نوع ديناميكي.

وبالتالي، على سبيل المثال، يمكن إنشاء صنف `Vehicle` (مركبة) التي تحتوي على محرك عضو من واجهة محرك `IMotor`، ولكن لا يوجد نوع محدد من المحرك `Motor` معرف مسبقًا، عن طريق إخبار مُنشئ السيارة `Vehicle constructor` باستخدام محرك كهربائي `ElectricMotor` أو محرك بنزين `GasolineMotor`. يستدعي كود مُنشئ المركبة `Vehicle constructor` بعد ذلك طريقة مصنع المحرك، لإنشاء المحرك المطلوب الذي يتوافق مع واجهة `IMotor`.
* يسمح ببناء الاصناف الفرعية إلى أحد الأصناف الأبوية الذي لم يتم تحديد نوع مكوناته مسبقًا، ولكن تم تعريفه فقط في واجهة، أو تم تعريفه على أنه نوع ديناميكي.

على سبيل المثال، يمكن لمركبة من الصنف `Vehicle` التي لديها عضو محدد بنوع ديناميكي، أن تحتوي على اصناف فرعية من النوع `ElectricPlane` و `OldCar` تم تصميم كل منها بنوع مختلف من المحركات. يمكن تحقيق ذلك عن طريق بناء الاصناف الفرعية بطريقة مصنع المركبات، مع توفير نوع المحرك. في مثل هذه الحالات قد يكون المنشئ مخفيًا.
* يسمح لكود أكثر قابلية للقراءة في الحالات التي توجد فيها منشآت متعددة، كل منها لسبب مختلف.

على سبيل المثال إذا كان هناك نوعان من المنشئات `Vehicle(make:string, motor:number)` و `Vehicle(make:string, owner:string, license:number, purchased:date)` فإن المنشئ ذو المقروئية الأفضل للاصناف يكون باستخدام `Vehicle.CreateOwnership(make:string, owner:string, license:number purchased: date)` مقابل `Vehicle.Create(make:string, motor:number)`
يسمح للصنف بتأجيل التمثيل (إنشاء كائن) إلى الاصناف الفرعية، ومنع التمثيل المباشر لكائن من نوع الصنف الأصل (الأب).

* 

على سبيل المثال، يمكن منع المركبة Vehicle من أن يتم تمثيلها مباشرة لأنها لا تحتوي على *مُنشئ*، ويمكن إنشاء الاصناف الفرعية فقط مثل ElectricPlane أو OldCar عن طريق استدعاء طريقة مصنع السيارة (الثابتة)Vehicle في *مُنشئ* الأصناف الفرعية أو *المُهيئ*.
إنشاء كائن مباشرة داخل الصنف الذي يتطلب أو يستخدم الكائن غير المرن لأنه يلزم الصنف بكائن معين ويجعل من المستحيل تغيير التمثيل بشكل مستقل عن الصنف. يتطلب *الممثل* في تغييرًا في كود الصنف الذي نفضل عدم لمسه. ويشار إلى هذا باسم *اقتران الكود* ويساعد نمط طريقة المصنع في *فصل* الكود.

يتم استخدام نمط تصميم طريقة المصنع من خلال تحديد عملية منفصلة أولاً، *طريقة المصنع*، لإنشاء كائن، ثم استخدام *طريقة المصنع* هذه عن طريق استدعاءها لإنشاء الكائن. يتيح ذلك كتابة الاصناف الفرعية التي تحدد كيفية إنشاء كائن أصل ونوع الكائنات التي يحتوي عليها الأصل. انظر الرسم التخطيطي لصنف يو-أم-إل أدناه.

تعريف
-----

«عرّف واجهة لإنشاء كائن، لكن دع الصنف الفرعي يقرر أي صنف يريد إنشاء مثيل له. تتيح طريقة المصنع للصنف تأجيل التمثيل الذي تستخدمه في الصنف الفرعي». (عصابة الأربعة)

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

يعتمد نمط طريقة المصنع على الوراثة، حيث يتم *تفويض* إنشاء الكائن إلى *الاصناف الفرعية* التي تطبق طريقة المصنع لإنشاء الكائنات.

بناء
----

### مخطط صنف UML

 رسم تخطيطي لصنف UML لنمط تصميم طريقة المصنع. 
في الرسم التخطيطي لصنف يو-أم-إل أعلاه، الصنف `Creator` الذي يتطلب كائن `Product`

لا *يمثل* الصنف `Product1` مباشرة.

بدلاً من ذلك، يشير `Creator` إلى الدالة المنفصلة `()factoryMethod` لإنشاء كائن منتج، مما يجعل `Creator` مستقلاً حيث يتم إنشاء تمثيل لصنف محدد منه. يمكن للاصناف الفرعية من `Creator` إعادة تعريف *صنف* التي يجب إنشاء *مثيل* لها. في هذا المثال، يقوم الصنف الفرعي `Creator1` *بتطبيق* الدالة

*المجردة* `(factoryMethod)` عن طريق إنشاء مثيل لصنف `Product1` .

مثال
----

يمكن لعب لعبة متاهة في وضعين، أحدهما يحتوي على غرف عادية متصلة فقط بالغرف المجاورة، والآخر بغرف سحرية تسمح بنقل اللاعبين بشكل عشوائي.

### هيكل

`Room` هو الصنف الأساسي للمنتج النهائي (`MagicRoom` أو `OrdinaryRoom`). عن طريق *الاعلان البرمجي* لشركة `MazeGame` عن *طريقة المصنع المجردة* لإنتاج مثل هذا المنتج الأساسي.

`MagicRoom` و `OrdinaryRoom` هما اصناف فرعية `MagicRoom` للمنتج الأساسي الذي *ينفذ* المنتج النهائي. وهكذا تقوم *طرق المصنع* *فصل الاستدعائين* (`MazeGame`) من **تنفيذ** *أصناف محددة*. وهذا يجعل عامل التشغيل البرمجي «جديد» "**new**" زائداً عن الحاجة، ويسمح بالالتزام بمبدأ فتح / إغلاق ويجعل المنتج النهائي أكثر مرونة في حالة التغيير.

### أملثة تطبيقية

#### لغة سي شارب

الكود: 

```
//Empty vocabulary of actual object
public interface IPerson
{
 string GetName();
}

public class Villager : IPerson
{
 public string GetName()
 {
 return "Village Person";
 }
}

public class CityPerson : IPerson
{
 public string GetName()
 {
 return "City Person";
 }
}

public enum PersonType
{
 Rural,
 Urban
}

/// <summary>
/// Implementation of Factory - Used to create objects
/// </summary>
public class Factory
{
 public IPerson GetPerson(PersonType type)
 {
 switch (type)
 {
 case PersonType.Rural:
 return new Villager();
 case PersonType.Urban:
 return new CityPerson();
 default:
 throw new NotSupportedException();
 }
 }
}

```
 في الكود أعلاه، يمكنك رؤية إنشاء ***واجهة برمجية*** واحدة تسمى **IPerson** وتنفيذين يسمى **Villager** و **CityPerson**. استنادًا إلى النوع الذي تم تمريره إلى كائن المصنع، فإننا نعيد *الكائن المحدد الأصلي* **كواجهة** **IPerson**. طريقة المصنع هي مجرد إضافة إلى صنف المصنع. يقوم بإنشاء كائن من الصنف من خلال واجهات برمجية ولكن من ناحية أخرى، فإنه يتيح أيضًا للاصناف الفرعية تحديد الصنف التي يتم إنشاء مثيل لها. 

```
public interface IProduct
{
 string GetName();
 string SetPrice(double price);
}

public class Phone : IProduct
{
 private double \_price;

 public string GetName()
 {
 return "Apple TouchPad";
 }

 public string SetPrice(double price)
 {
 this.\_price = price;
 return "success";
 }
}

/\* Almost same as Factory, just an additional exposure to do something with the created method \*/
public abstract class ProductAbstractFactory
{
 protected abstract IProduct MakeProduct();

 public IProduct GetObject() // Implementation of Factory Method.
 {
 return this.MakeProduct();
 }
}

public class PhoneConcreteFactory : ProductAbstractFactory
{
 protected override IProduct MakeProduct()
 {
 IProduct product = new Phone();
 //Do something with the object after you get the object. 
 product.SetPrice(20.30);
 return product;
 }
}

```
 يمكنك أن ترى أننا استخدمنا **MakeProduct** في مصنع التحديد **concreteFactory**. نتيجة لذلك، يمكنك بسهولة استدعاء **() MakeProduct** منه للحصول على **IProduct**. يمكنك أيضًا كتابة منطقك البرمجي المخصص بعد الحصول على الكائن في ***طريقة مصنع التحديد***. يتم إجراء **GetObject** مجردة في واجهة المصنع.

#### جافا

يشبه مثال جافا هذا أحد الأمثلة الموجودة في كتاب *أنماط تصميم.*

يستخدم **MazeGame** الغرف ولكنه يضع مسؤولية إنشاء الغرف على الاصناف الفرعية التي تنشئ اصناف محددة. يمكن أن يستخدم ***وضع اللعبة العادي*** ***طريقة القالب*** هذه: 

```
public abstract class Room {
 abstract void connect(Room room);
}

public class MagicRoom extends Room {
 public void connect(Room room) {}
}

public class OrdinaryRoom extends Room {
 public void connect(Room room) {}
}

public abstract class MazeGame {
 private final List<Room> rooms = new ArrayList<>();

 public MazeGame() {
 Room room1 = makeRoom();
 Room room2 = makeRoom();
 room1.connect(room2);
 rooms.add(room1);
 rooms.add(room2);
 }

 abstract protected Room makeRoom();
}

```
 في المقتطف أعلاه، `MazeGame` مُنشئ (constructor) `MazeGame` *طريقة قالب* تجعل بعض المنطق شائعًا. يشير إلى طريقة المصنع `makeRoom` التي تتضمن إنشاء الغرف بحيث يمكن استخدام الغرف الأخرى في اصناف فرعية. لتنفيذ وضع اللعبة game mode الآخر الذي يحتوي على غرف سحرية magic rooms ، يكفي ***تجاوز*** `makeRoom` ***برمجياً***: 

```
public class MagicMazeGame extends MazeGame {
 @Override
 protected Room makeRoom() {
 return new MagicRoom(); 
 }
}

public class OrdinaryMazeGame extends MazeGame {
 @Override
 protected Room makeRoom() {
 return new OrdinaryRoom(); 
 }
}

MazeGame ordinaryGame = new OrdinaryMazeGame();
MazeGame magicGame = new MagicMazeGame();

```

#### بي أتش بي

يتبع مثال آخر في بي أتش بي، هذه المرة باستخدام تنفيذ الواجهة بدلاً من التصنيف الفرعي (ومع ذلك يمكن تحقيق نفس الشيء من خلال التصنيف الفرعي). من المهم ملاحظة أنه يمكن أيضًا تعريف طريقة المصنع على أنها عامة واستدعاؤها مباشرةً بواسطة ***كود العميل*** client code (على النقيض من مثال جافا أعلاه). 

```
/\* Factory and car interfaces \*/

interface CarFactory
{
  public function makeCar() : Car;
}

interface Car
{
  public function getType() : string;
}

/\* Concrete implementations of the factory and car \*/

class SedanFactory implements CarFactory
{
  public function makeCar() : Car
  {
    return new Sedan();
  }
}

class Sedan implements Car
{
  public function getType() : string
  {
    return 'Sedan';
  }
}

/\* Client \*/

$factory = new SedanFactory();
$car = $factory->makeCar();
print $car->getType();

```

#### بايثون

نفس مثال جافا. 

```
from abc import ABC, abstractmethod
class MazeGame(ABC):

  def \_\_init\_\_(self) -> None:
    self.rooms = []
    self.\_prepare\_rooms()

  def \_prepare\_rooms(self) -> None:
    room1 = self.make\_room()
    room2 = self.make\_room()

    room1.connect(room2)
    self.rooms.append(room1)
    self.rooms.append(room2)

  def play(self) -> None:
    print('Playing using "{}"'.format(self.rooms[0]))

  @abstractmethod
  def make\_room(self):
    raise NotImplementedError("You should implement this!")
class MagicMazeGame(MazeGame):

  def make\_room(self):
    return MagicRoom()
class OrdinaryMazeGame(MazeGame):

  def make\_room(self):
    return OrdinaryRoom()
class Room(ABC):
  def \_\_init\_\_(self) -> None:
    self.connected\_rooms = []

  def connect(self, room) -> None:
    self.connected\_rooms.append(room)
class MagicRoom(Room):
  def \_\_str\_\_(self):
    return "Magic room"
class OrdinaryRoom(Room):
  def \_\_str\_\_(self):
    return "Ordinary room"
ordinaryGame = OrdinaryMazeGame()
ordinaryGame.play()

magicGame = MagicMazeGame()
magicGame.play()

```

الاستخدامات
-----------

* في ADO. NET ، IDbCommand. CreateParameter هو مثال على استخدام طريقة المصنع ***لربط التسلسلات الهرمية للصنف المتوازية***.
* في Qt ، QMainWindow :: createPopupMenu هي طريقة مصنع تم الاعلان البرمحي عنها في إطار عمل يمكن تجاوزه برمجياً في كود التطبيق.
* في جافا، يتم استخدام العديد من المصانع البرمجية في **حزمة** **javax.xml.parsers**. مثل **javax.xml.parsers.DocumentBuilderFactory** أو **javax.xml.parsers.SAXParserFactory**.
* في HTML5 DOM API ، تحتوي واجهة المستند **Document** -على طريقة مصنع **createElement** لإنشاء عناصر محددة لواجهة **HTMLElement**.

ملحق: مسرد المصطلحات الإنجليزية
-------------------------------


|  |
| --- |
| مَسرد المفردات وفق أقسام المقالة |
| المقدمة |
| **البرمجة القائمة على الأصناف** | **class-based programming** |
| طرق المصنع البرمجية او دوال المصنع البرمجية | factory methods |
| واجهة | interface |
| اصناف فرعية | child classes |
| صنف أساسي | base class |
| تجاوزه اختياريًا بواسطة الاصناف المشتقة | optionally overridden by derived classes |
| المُهيئ | initializer |
| الممثل | instantiator |
| *اقتران الكود* | *code coupling* |
| *فصل* الكود | *decoupling* |
| كائن إنشاء | composing object |
| شؤون الكائن المؤلف | composing object's concerns |
| النوع البرمجي للمنتج المشتق | derived type |
| تفويض | delegated |
| الاصناف الفرعية | subclasses |
| *يمثل* | instantiate |
| الصنف | class |
| إنشاء تمثيل لصنف محدد منه | concrete class is instantiated |
| مثيل | instantiate |
| بتطبيق | implements |
| المجردة | abstract |
| إنشاء مثيل ل | instantiating |
| *الاعلان البرمجي* | declare |
| طريقة المصنع المجردة | the abstract factory method |
| اصناف فرعية | subclasses |
| ينفذ | implementing |
| طرق المصنع | factory methods |
| فصل الاستدعائين | decouple callers |
| تنفيذ | implementation |
| أصناف محددة | concrete classes |
| عامل التشغيل البرمجي | Operator |
| زائداً عن الحاجة | redundant |
| واجهة | interface |
| الكائن المحدد الأصلي | original concrete object |
| منطقك البرمجي المخصص | custom logic |
| ***طريقة مصنع التحديد*** | concrete Factory Method |
| ***وضع اللعبة العادي*** | regular game mode |
| طريقة القالب | template method |
| تجاوز برمجي | override |
| تنفيذ الواجهة | interface implementations |
| كودالعميل | client code |
| لربط التسلسلات الهرمية للصنف المتوازية | connect parallel class hierarchies |
| طار عمل | framework |
| تجاوزه برمجياً في كود التطبيق | overridden in application code |
| حزمة | package |

انظر أيضا
---------

* *أنماط التصميم* ، الكتاب ذو التأثير الكبير
* نمط التصميم، نظرة عامة على أنماط التصميم بشكل عام
* نمط المصنع التجريدي، وهو نمط يتم تنفيذه غالبًا باستخدام أساليب المصنع
* نمط البناء، نمط إبداعي آخر
* نمط طريقة القالب، والذي قد يستدعي طرق المصنع
* إن فكرة جوشوا بلوخ عن *طريقة مصنع ثابتة* ، والتي يقول عنها ليس لها مكافئ مباشر في *أنماط التصميم* .

المراجع
-------

1. ↑  Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). *Design Patterns: Elements of Reusable Object-Oriented Software*. Addison Wesley. ص. 107ff. ISBN:0-201-63361-2. مؤرشف من الأصل في 2020-05-18.`{{استشهاد بكتاب}}`: صيانة الاستشهاد: أسماء متعددة: قائمة المؤلفين (link)
2. ↑  "The Factory Method design pattern - Problem, Solution, and Applicability". *w3sDesign.com*. مؤرشف من الأصل في 2020-05-18. اطلع عليه بتاريخ 2017-08-17.
3. ↑  Freeman، Eric؛ Freeman، Elisabeth؛ Kathy، Sierra؛ Bert، Bates (2004). Hendrickson؛ Loukides (المحررون). *Head First Design Patterns*. O'REILLY. ج. 1. ص. 162. ISBN:978-0-596-00712-6. مؤرشف من الأصل (paperback) في 2020-04-30. اطلع عليه بتاريخ 2012-09-12.
4. ↑  "The Factory Method design pattern - Structure and Collaboration". *w3sDesign.com*. مؤرشف من الأصل في 2020-05-18. اطلع عليه بتاريخ 2017-08-12.

* Martin Fowler؛ Kent Beck؛ John Brant؛ William Opdyke؛ Don Roberts (يونيو 1999). *Refactoring: Improving the Design of Existing Code*. Addison-Wesley. ISBN:0-201-48567-2.
* Gamma, Erich؛ Helm, Richard؛ Johnson, Ralph؛ Vlissides, John (1994). *Design Patterns: Elements of Reusable Object-Oriented Software*. Addison-Wesley. ISBN:0-201-63361-2.
* Cox, Brad J. (1986). *Object-oriented programming: an evolutionary approach*. Addison-Wesley. ISBN:978-0-201-10393-9.
* Cohen، Tal؛ Gil, Joseph (2007). "Better Construction with Factories" (PDF). *برتراند ماير*. ج. 6 ع. 6: 103. DOI:10.5381/jot.2007.6.6.a3. مؤرشف من الأصل (PDF) في 2016-10-13. اطلع عليه بتاريخ 2007-03-12.

روابط خارجية
------------

* تنفيذ نمط تصميم المصنع في جافا
* طريقة المصنع في UML و LePUS3 (لغة وصنف التصميم)
* فكر في طرق المصنع الثابتة التي كتبها جوشوا بلوخ

| * ع
* ن
* ت
 أنماط تصميم البرمجيات (برمجة) |
| --- |
| إنشائي (Creational) | 
* Abstract factory  ‏
* نمط تصميم الباني
* حقن التبعية
* نمط طريقة المصنع
* Lazy initialization
* Multiton
* Object pool  ‏
* Prototype
* اكتساب الموارد تهيئة
* النمط المفرد

 |
| هيكلي (Structural) | 
* نمط المحول
* نموذج التصميم جسر
* نموذج التصميم المجمع
* نموذج التصميم ديكور
* نمط\_التفويض
* نمط واجهة المبنى
* نموذج التصميم وزن الذبابة
* Front controller
* Marker interface  ‏
* Module
* نمط الوكيل
* Twin

 |
| سلوكي (Behavioral) | 
* Blackboard
* Chain of responsibility
* Command
* Interpreter
* نمط المكرر
* Mediator
* Memento
* Null object  ‏
* المراقب (نموذج تصميم)
* Servant
* Specification
* State
* نموذج الإستراتيجية
* Template method  ‏
* Visitor

 |
| وظيفي (Functional) | 
* مونويد
* Functor
* Applicative
* Monad
* Comonad
* Free monad
* HOF
* Currying
* Function composition  ‏
* Closure
* المولد

 |
| متزامن (Concurrency) | 
* Active object
* Actor
* Balking
* حاجز (حوسبة)
* Binding properties  ‏
* Coroutine
* Compute kernel
* Double-checked locking
* Event-based asynchronous  ‏
* ليف
* Futex
* Futures and promises
* Guarded suspension
* Immutable object
* Join
* Lock
* صيغة التراسل
* Monitor
* Nuclear
* Proactor
* Reactor
* Read write lock  ‏
* Scheduler
* STM
* Thread pool
* Thread-local storage

 |
| معماري (Architectural) | 
* \* ADR
* نمط التسجيل النشط
* نمط الوسيط
* نموذج الخادم والعميل
* هندسة البرمجيات بالمكونات
* DAO
* كائن نقل البيانات
* تصميم موجه بالمجال
* ECB
* ECS
* EDA
* Front controller
* Identity map  ‏
* Interceptor
* Implicit invocation
* عكس التحكم
* Model 2  ‏
* MOM
* Microservices
* MVA
* نمط وعرض ومتحكم
* MVP
* MVVM
* Monolithic
* عمارة متعددة الطبقات
* Naked objects
* ORB
* ند لند
* Publish–subscribe
* PAC
* رست
* بنية خدمية
* نمط محدد موقع الخدمة
* SN
* SBA
* Specification

 |
| توزيع سحابي (Cloud Distributed) | 
* Ambassador
* Anti-Corruption Layer
* Bulkhead
* Cache-Aside
* Circuit Breaker  ‏
* CQRS
* Compensating Transaction  ‏
* Competing Consumers
* Compute Resource Consolidation
* Event Sourcing
* External Configuration Store
* Federated Identity
* Gatekeeper
* فهرس قاعدة بيانات
* Leader Election  ‏
* نموذج الهيكلة والتجميع
* Materialized View  ‏
* Pipes
* Filters
* Priority Queue
* Publisher-Subscriber
* Queue-Based Load Leveling
* Retry
* Scheduler Agent Supervisor
* Sharding
* Sidecar
* Strangler
* Throttling
* Valet Key

 |
| أخرى | 
* Business delegate  ‏
* Composite entity  ‏
* Intercepting filter  ‏
* التحميل البطئ
* Mangler
* غرض مقلد
* Type tunnel  ‏
* Method chaining

 |
| كتب | 
* *خطط التصميم*
* *Enterprise Integration Patterns*
* *Code Complete*
* *POSA*

 |
| أشخاص | 
* كريستوفر الكسندر
* إريك جاما
* رالف جونسن
* John Vlissides
* غرادي بوتش
* كينت بيك
* وورد كانينغهام
* مارتن فاولر
* روبرت سيسيل مارتن
* Jim Coplien
* دوغلاس س. شميت
* Linda Rising

 |
| مجتمعات (Communities) | 
* The Hillside Group
* The Portland Pattern Repository  ‏

 |

|  |
| --- |
| **نمط طريقة المصنع** في المشاريع الشقيقة: |
|  | 
* معرض صور من كومنز.
 |

* أيقونة بوابةبوابة تقانة المعلومات
* أيقونة بوابةبوابة علم الحاسوب