نمط طريقة المصنع  في البرمجة القائمة على الأصناف، يعد نمط طريقة المصنع نمطًا انشائياً (اي الأنماط المسؤولة عن انشاء كائنات) يستخدم طرق المصنع للتعامل مع مشكلة إنشاء الكائنات دون الحاجة إلى تحديد صنف الكائن الذي سيتم إنشاؤه بالضبط. يتم ذلك بواسطة إنشاء كائنات عن طريق استدعاء طريقة المصنع - إما محدد في واجهة ويتم تنفيذه بواسطة اصناف فرعية، أو يتم تنفيذه في صنف أساسي ويتم تجاوزه اختياريًا بواسطة الاصناف المشتقة - بدلاً من استدعاء مُنشئ.  يعد نمط تصميم طريقة المصنع أحد "أنماط التصميم "عصابة الأربعة"" التي تصف كيفية حل مشكلات التصميم المتكررة لتصميم برامج مرنة وكائنية التوجه قابلة لإعادة الاستخدام، أي الكائنات التي يسهل تنفيذها أو تغييرها أو اختبارها، وإعادة استخدامها.  يتم استخدام نمط (تصميم) طريقة المصنع بدلاً من مُنشئ الصنف العادي للاحتفاظ بمبدأ SOLID للبرمجة، وفصل بناء الكائنات عن الكائنات نفسها. هذه الفكرة لها مزايا ومفيدة للحالات التالية، من بين أمور أخرى:   يسمح للصنف بتأجيل التمثيل (إنشاء كائن) إلى الاصناف الفرعية، ومنع التمثيل المباشر لكائن من نوع الصنف الأصل (الأب).  إنشاء كائن مباشرة داخل الصنف الذي يتطلب أو يستخدم الكائن غير المرن لأنه يلزم الصنف بكائن معين ويجعل من المستحيل تغيير التمثيل بشكل مستقل عن الصنف. يتطلب "الممثل" في تغييرًا في كود الصنف الذي نفضل عدم لمسه. ويشار إلى هذا باسم "اقتران الكود" ويساعد نمط طريقة المصنع في "فصل" الكود.  يتم استخدام نمط تصميم طريقة المصنع من خلال تحديد عملية منفصلة أولاً، "طريقة المصنع"، لإنشاء كائن، ثم استخدام "طريقة المصنع" هذه عن طريق استدعاءها لإنشاء الكائن. يتيح ذلك كتابة الاصناف الفرعية التي تحدد كيفية إنشاء كائن أصل ونوع الكائنات التي يحتوي عليها الأصل. انظر الرسم التخطيطي لصنف يو-أم-إل أدناه.  «عرّف واجهة لإنشاء كائن، لكن دع الصنف الفرعي يقرر أي صنف يريد إنشاء مثيل له. تتيح طريقة المصنع للصنف تأجيل التمثيل الذي تستخدمه في الصنف الفرعي». (عصابة الأربعة)  غالبًا ما يتطلب إنشاء كائن عمليات معقدة غير مناسبة لتضمينها في "كائن إنشاء". قد يؤدي إنشاء الكائن إلى ازدواجية كبيرة في التعليمات البرمجية، وقد يتطلب معلومات لا يمكن الوصول إليها للكائن المؤلف، وقد لا يوفر مستوى كافًا من التجريد، أو قد لا يكون جزءًا من "شؤون الكائن المؤلف". يعالج نمط تصميم طريقة المصنع هذه المشاكل من خلال تحديد طريقة منفصلة لإنشاء الكائنات، والتي يمكن للاصناف الفرعية تجاوزها لتحديد "النوع البرمجي للمنتج المشتق" الذي سيتم إنشاؤه.  يعتمد نمط طريقة المصنع على الوراثة، حيث يتم "تفويض" إنشاء الكائن إلى "الاصناف الفرعية" التي تطبق طريقة المصنع لإنشاء الكائنات.  في الرسم التخطيطي لصنف يو-أم-إل أعلاه، الصنف codice_12 الذي يتطلب كائن codice_13  لا "يمثل" الصنف codice_14 مباشرة.  بدلاً من ذلك، يشير codice_12 إلى الدالة المنفصلة codice_16 لإنشاء كائن منتج، مما يجعل codice_12 مستقلاً حيث يتم إنشاء تمثيل لصنف محدد منه. يمكن للاصناف الفرعية من codice_12 إعادة تعريف "صنف" التي يجب إنشاء "مثيل" لها. في هذا المثال، يقوم الصنف الفرعي codice_19 "بتطبيق" الدالة  "المجردة" codice_20 عن طريق إنشاء مثيل لصنف codice_14 .  يمكن لعب لعبة متاهة في وضعين، أحدهما يحتوي على غرف عادية متصلة فقط بالغرف المجاورة، والآخر بغرف سحرية تسمح بنقل اللاعبين بشكل عشوائي.  codice_22 هو الصنف الأساسي للمنتج النهائي (codice_23 أو codice_24). عن طريق "الاعلان البرمجي" لشركة codice_25 عن "طريقة المصنع المجردة" لإنتاج مثل هذا المنتج الأساسي.  codice_23 و codice_24 هما اصناف فرعية codice_23 للمنتج الأساسي الذي "ينفذ" المنتج النهائي. وهكذا تقوم "طرق المصنع" "فصل الاستدعائين" (codice_25) من تنفيذ "أصناف محددة". وهذا يجعل عامل التشغيل البرمجي «جديد» "new" زائداً عن الحاجة، ويسمح بالالتزام بمبدأ فتح / إغلاق ويجعل المنتج النهائي أكثر مرونة في حالة التغيير.  الكود:  //Empty vocabulary of actual object public interface IPerson  public class Villager : IPerson  public class CityPerson : IPerson  public enum PersonType  /// <summary> /// Implementation of Factory - Used to create objects /// </summary> public class Factory public interface IProduct  public class Phone : IProduct  /* Almost same as Factory, just an additional exposure to do something with the created method */ public abstract class ProductAbstractFactory  public class PhoneConcreteFactory : ProductAbstractFactory  يشبه مثال جافا هذا أحد الأمثلة الموجودة في كتاب "أنماط تصميم."  يستخدم MazeGame الغرف ولكنه يضع مسؤولية إنشاء الغرف على الاصناف الفرعية التي تنشئ اصناف محددة. يمكن أن يستخدم وضع اللعبة العادي طريقة القالب هذه:  public abstract class Room {  public class MagicRoom extends Room {  public class OrdinaryRoom extends Room {  public abstract class MazeGame {  public class MagicMazeGame extends MazeGame {  public class OrdinaryMazeGame extends MazeGame {  MazeGame ordinaryGame = new OrdinaryMazeGame(); MazeGame magicGame = new MagicMazeGame();  يتبع مثال آخر في بي أتش بي، هذه المرة باستخدام تنفيذ الواجهة بدلاً من التصنيف الفرعي (ومع ذلك يمكن تحقيق نفس الشيء من خلال التصنيف الفرعي). من المهم ملاحظة أنه يمكن أيضًا تعريف طريقة المصنع على أنها عامة واستدعاؤها مباشرةً بواسطة كود العميل client code (على النقيض من مثال جافا أعلاه).  /* Factory and car interfaces */  interface CarFactory  interface Car  /* Concrete implementations of the factory and car */  class SedanFactory implements CarFactory  class Sedan implements Car  /* Client */  $factory = new SedanFactory(); $car = $factory->makeCar(); print $car->getType(); نفس مثال جافا.  from abc import ABC, abstractmethod class MazeGame(ABC):  class MagicMazeGame(MazeGame):  class OrdinaryMazeGame(MazeGame):  class Room(ABC):  class MagicRoom(Room): class OrdinaryRoom(Room): ordinaryGame = OrdinaryMazeGame() ordinaryGame.play()  magicGame = MagicMazeGame() magicGame.play()