سؤال

هذا يربكني ، بأبسط المصطلحات ماذا تفعل؟ تظاهر أنك تشرح لأمك أو شخص ما من فضلك تقريبًا.

هل كانت مفيدة؟

المحلول

المصنع يخلق كائن. لذا ، إذا أردت البناء

 class A{
    public $classb;
    public $classc;
    public function __construct($classb, $classc)
    {
         $this->classb = $classb;
         $this->classc = $classc;
    }
  }

لن ترغب في الاعتماد على الاضطرار إلى القيام بالرمز التالي في كل مرة تقوم فيها بإنشاء الكائن

$obj = new ClassA(new ClassB, new Class C);

هذا هو المكان الذي سيأتي فيه المصنع. نحدد مصنعًا لرعاية ذلك من أجلنا:

class Factory{
    public function build()
    {
        $classc = $this->buildC();
        $classb = $this->buildB();
        return $this->buildA($classb, $classc);

    }

    public function buildA($classb, $classc)
    {
        return new ClassA($classb, $classc);
    }

    public function buildB()
    {
        return new ClassB;
    }

    public function buildC()
    {
        return new ClassC;
    }
}

الآن كل ما علينا فعله هو

$factory = new Factory;
$obj     = $factory->build();

الميزة الحقيقية هي عندما تريد تغيير الفصل. لنقول أننا أردنا أن نمر في فئة مختلفة:

class Factory_New extends Factory{
    public function buildC(){
        return new ClassD;
    }
}

أو فئة جديدة:

class Factory_New2 extends Factory{
    public function buildB(){
        return new ClassE;
    }
}

الآن يمكننا استخدام الميراث لتعديل كيفية إنشاء الفصل بسهولة ، لوضع مجموعة مختلفة من الفئات.

مثال جيد قد يكون فئة المستخدم هذه:

class User{
    public $data;
    public function __construct($data)
    {
        $this->data = $data;
    }
}

في هذا الصف $data هو الفصل الذي نستخدمه لتخزين بياناتنا. الآن لهذا الفصل ، دعنا نستخدم جلسة لتخزين بياناتنا. سيبدو المصنع هكذا:

class Factory{
    public function build()
    {
        $data = $this->buildData();
        return $this->buildUser($data);
    }

    public function buildData()
    {
        return SessionObject();
    }

    public function buildUser($data)
    {
        return User($data);
    }
}

الآن ، دعنا نقول بدلاً من ذلك أننا نريد تخزين جميع بياناتنا في قاعدة البيانات ، من السهل حقًا تغييرها:

class Factory_New extends Factory{
    public function buildData()
    {
        return DatabaseObject();
    }
}

المصانع هي نمط تصميم نستخدمه للتحكم في كيفية تجميع الكائنات معًا ، ويسمح لنا استخدام أنماط المصنع الصحيحة بإنشاء الكائنات المخصصة التي نحتاجها.

نصائح أخرى

مثل مصنع الحياة الواقعية ، فإنه يخلق شيئًا ويعيده.

تخيل شيئًا كهذا

$joe = new Joe();
$joe->say('hello');

أو طريقة المصنع

Joe::Factory()->say('hello');

سيقوم تنفيذ طريقة المصنع بإنشاء مثيل جديد وإعادته.

يعد نمط تصميم المصنع جيدًا جدًا عندما تتعامل مع موارد متعددة وتريد تنفيذ تجريد عالي المستوى.

دعنا نقسم هذا إلى قسم مختلف.

لنفترض أنه يتعين عليك تنفيذ التجريد ولا يحتاج مستخدم فصلك إلى الاهتمام بما قمت بتنفيذه في تعريف الفصل.

هو/هي فقط بحاجة إلى القلق بشأن استخدام أساليب الفصل الخاص بك.

على سبيل المثال ، لديك قواعدتان لمشروعك

class MySQLConn {

        public function __construct() {
                echo "MySQL Database Connection" . PHP_EOL;
        }

        public function select() {
                echo "Your mysql select query execute here" . PHP_EOL;
        }

}

class OracleConn {

        public function __construct() {
                echo "Oracle Database Connection" . PHP_EOL;
        }

        public function select() {
                echo "Your oracle select query execute here" . PHP_EOL;
        }

}

سيهتم فئة المصنع الخاصة بك بإنشاء كائن لاتصال قاعدة البيانات.

class DBFactory {

        public static function getConn($dbtype) {

                switch($dbtype) {
                        case "MySQL":
                                $dbobj = new MySQLConn();
                                break;
                        case "Oracle":
                                $dbobj = new OracleConn();
                                break;
                        default:
                                $dbobj = new MySQLConn();
                                break;
                }

                return $dbobj;
        }

}

يحتاج المستخدم فقط إلى تمرير اسم قاعدة البيانات

$dbconn1 = DBFactory::getConn("MySQL");
$dbconn1->select();

انتاج:

MySQL Database Connection
Your mysql select query execute here

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

$dbconn2 = DBFactory::getConn("Oracle");
$dbconn2->select();

انتاج:

Oracle Database Connection
Your oracle select query execute here

أتمنى أن يساعد هذا.

بشكل عام ، ينتج "المصنع" شيئًا: في حالة برمجة الكائنات الموجه إلى الكائن ، ينتج "نمط تصميم المصنع" كائنات.

لا يهم ما إذا كان في PHP أو C# أو أي لغة أخرى موجهة للكائن.

نمط تصميم المصنع (نمط المصنع) هو للاقتران فضفاض. مثل معنى المصنع ، البيانات إلى مصنع (إنتاج البيانات) للمستخدم النهائي. بهذه الطريقة ، يكسر المصنع الاقتران الضيق بين مصدر البيانات وعملية البيانات.

المصنع يولد فقط كائن أو كائنات.

قد يكون لديك مصنع يبني اتصال MySQL.

http://en.wikipedia.org/wiki/factory_method_pattern

هذه الإجابة تتعلق بالمنصب الآخر الذي قال فيه دانييل وايت لاستخدام المصنع لإنشاء اتصال MySQL باستخدام نمط المصنع.

بالنسبة لاتصال MySQL ، أفضل استخدام نمط Singleton حيث تريد استخدام نفس الاتصال للوصول إلى قاعدة البيانات التي لا تنشئ نظامًا آخر.

النهج الكلاسيكي لتثبيت كائن ما هو:

$Object=new ClassName();

لدى PHP القدرة على إنشاء كائن ديناميكي من اسم متغير باستخدام بناء الجملة التالي:

$Object=new $classname;

حيث يحتوي اسم className $ المتغير على اسم الفئة One يريد إنشاء مثيله.

لذلك سيبدو العوملة الكلاسيكية:

function getInstance($classname)
{
  if($classname==='Customer')
  {
    $Object=new Customer();
  }
  elseif($classname==='Product')
  {
    $Object=new Product();
  }
  return $Object;
}

وإذا اتصلت بوظيفة GetInstance ('Product') ، فسيقوم هذا المصنع بإنشاء كائن المنتج وإرجاعه. وإلا إذا قمت بالاتصال بوظيفة GetInstance ('Customer') ، فسيقوم هذا المصنع بإنشاء وإرجاع كائن نوع العميل (تم إنشاؤه من فئة Customer ()).

لم تعد هناك حاجة لذلك ، يمكن للمرء إرسال "منتج" أو "عميل" (أسماء دقيقة للفئات الموجودة) كقيمة متغيرة للتثبيت الديناميكي:

$classname='Product';
$Object1=new $classname; //this will instantiate new Product()

$classname='Customer';
$Object2=new $classname; //this will instantiate new Customer()

بالنسبة للسجل ، بكلمات سهلة ، يقوم مصنع مثل Pindatjuh ، بإرجاع كائن.

إذن ، ما الفرق مع مُنشئ؟ (هذا يفعل الشيء نفسه)

  1. يستخدم المنشئ مثيله الخاص.
  2. شيء أريده جدًا شيء أكثر تقدماً ولا أريد أن نفخك الكائن (أو إضافة تبعيات).
  3. يتم استدعاء مُنشئ عند إنشاء كل مثيل. في بعض الأحيان لا تريد ذلك.

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

باستخدام المنشئ:

class Account {
      var $user;
      var $pwd;
      var ...
      public __construct() {
         // here i read from the file
         // and many other stuff
      }
}

باستخدام المصنع:

class Account {
      var $user;
      var $pwd;
      var ...
}
class AccountFactory {
      public static Create() {
         $obj=new Account();
         // here we read the file and more stuff.
         return $obj;
      }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top