পিএইচপি-তে একটি কারখানার নকশার প্যাটার্ন কী?


90

এটি আমাকে বিভ্রান্ত করে, সর্বাধিক সহজ ভাষায় এটি কী করে? আপনি আপনার মাকে বা প্রায় দয়া করে কারও কাছে ব্যাখ্যা দিচ্ছেন এমন ভান করুন।


116
আমার মা তা কোনওভাবেই বুঝতে পারবেন না ...
ব্রুনো রেইস

6
@ জেসনড্যাভিস আমি আপনার প্রশ্নের উত্তর দিয়েই চলেছি ... আমি একজন স্টকারের মতো অনুভব করতে শুরু করেছি।
টাইলার কার্টার

উত্তর:


176

একটি কারখানা একটি বস্তু তৈরি করে। সুতরাং, আপনি যদি নির্মাণ করতে চান

 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);

এখান থেকেই কারখানাটি আসত us আমাদের যত্ন নেওয়ার জন্য একটি কারখানা সংজ্ঞায়িত করি:

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

আসল সুবিধাটি যখন আপনি ক্লাস পরিবর্তন করতে চান is আসুন আমরা বলি যে আমরা একটি আলাদা ক্লাসিতে পাস করতে চেয়েছিলাম:

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

কারখানাগুলি হ'ল একটি নকশার ধরণ যা আমরা কীভাবে বস্তুকে একসাথে রাখি তা নিয়ন্ত্রণ করতে ব্যবহার করি এবং সঠিক কারখানার নিদর্শনগুলি আমাদের প্রয়োজনীয় কাস্টমাইজড অবজেক্ট তৈরি করতে দেয় allows


4
টাইপিং ছিল অনেক। এখন আমি আমার উইকিতে এটি কোনও সময়ে রেখে দিতে হবে।
টাইলার কার্টার

4
সুন্দর এবং সহায়ক। হ্যাটস অফ সাথ আপনার কাছে।
স্টিফগোসেলিন

4
কি আপনার কোড পার্থক্য / সুবিধা $obj = $factory->build();বেশি $obj = new whateverClass();? এছাড়াও, অন্য ক্লাসে (ক্লাসজেড বলুন) যা ক্লাসএ এর ডেটার উপর নির্ভর করে, ক্লাসজেডে আপনি কারখানার পদ্ধতিটি কোথায় ব্যবহার করবেন? আপনি এখনও এখনও ক্লাসের (ক্লাসএ) মধ্যে একটি ক্লাস (ক্লাস জেড) ইনস্ট্যান্ট করছেন, যার অর্থ কোনও পরীক্ষা নেই। উদাহরণস্বরূপ কারখানাটি newকেবল ব্যবহারের পরিবর্তে কোনও পদ্ধতির মাধ্যমে করার জন্য কোডের বোঝা বলে মনে হচ্ছে new
জেমস

এটি আমার জন্য বিভ্রান্তিকর। আমি গত ঘন্টা ধরে কারখানা এবং বিল্ডারদের সম্পর্কে পড়ছি এবং এটি কোনও বিল্ডারের মতো, কারখানা নয় বলে মনে হচ্ছে।
আকিনুরি

19

বাস্তব জীবনের কারখানার মতো এটি কিছু তৈরি করে এবং তা ফেরত দেয়।

এরকম কিছু কল্পনা করুন

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

বা একটি কারখানা পদ্ধতি

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

কারখানা পদ্ধতির বাস্তবায়ন একটি নতুন উদাহরণ তৈরি করবে এবং এটি ফিরিয়ে দেবে।


4
দুর্দান্ত উদাহরণ, আমায় অবাক করে দেয় যে এই প্যাটার্নটির জন্য বাস্তবায়নগুলি কতটা বিচিত্র। যখন স্ট্যাটিকালি বলা হয়, আমি ধরে নিই যে পরে কেউ একই উদাহরণটি পুনরায় ব্যবহার করতে উদাহরণটির একটি রেফারেন্স পেতে পারে? যেমন $ জো = জো :: কারখানা () -> বলুন ('হ্যালো');
স্টিফগোসেলিন

অবশ্যই 5.6 এ কেউ করতে পারে (নতুন জো ()) -> বলুন ('হ্যালো');
পানচো

14

যখন আপনি একাধিক সংস্থান নিয়ে কাজ করছেন এবং উচ্চ স্তরের বিমূর্তি প্রয়োগ করতে চান তখন কারখানার নকশার প্যাটার্নটি খুব ভাল।

এর বিভিন্ন অংশে বিভক্ত করা যাক।

মনে করুন আপনাকে বিমূর্তকরণ বাস্তবায়ন করতে হবে এবং আপনার শ্রেণীর ব্যবহারকারীর ক্লাস সংজ্ঞায় আপনি কী প্রয়োগ করেছেন সে সম্পর্কে যত্ন নেওয়ার প্রয়োজন নেই।

আপনার ক্লাসের পদ্ধতি ব্যবহার সম্পর্কে তাকে কেবল চিন্তা করতে হবে।

যেমন আপনার প্রকল্পের জন্য দুটি ডাটাবেস রয়েছে

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

আশা করি এটি সাহায্য করবে।


1

সাধারণভাবে একটি "ফ্যাক্টরি" কিছু উত্পাদন করে: অবজেক্ট-ওরিয়েন্টেট-প্রোগ্রামিংয়ের ক্ষেত্রে, "ফ্যাক্টরি ডিজাইনের ধরণ" অবজেক্ট তৈরি করে।

এটি পিএইচপি, সি # বা অন্য কোনও অবজেক্ট-ওরিয়েন্টেট ভাষায় কিনা তা বিবেচ্য নয়।


1

ফ্যাক্টরি ডিজাইনের প্যাটার্ন (কারখানার প্যাটার্ন) হ'ল কাপলিংয়ের জন্য। কারখানার অর্থের মতো, চূড়ান্ত ব্যবহারকারীর কাছে কারখানার ডেটা (ডেটা উত্পাদন করা)। এইভাবে, কারখানাটি ডেটা উত্স এবং ডেটা প্রক্রিয়া প্রক্রিয়া মধ্যে শক্ত সংযোগ বিরতি দেয় break



0

এই উত্তরটি অন্য পোস্টের সাথে সম্পর্কিত যেখানে ড্যানিয়েল হোয়াইট ফ্যাক্টরি প্যাটার্ন ব্যবহার করে মাইএসকিউএল সংযোগ তৈরির জন্য ফ্যাক্টরি ব্যবহার করতে বলেছিলেন।

মাইএসকিউএল সংযোগের জন্য আমি সিঙ্গলটন প্যাটার্নটি ব্যবহার করব কারণ আপনি ডাটাবেসটি অ্যাক্সেস করার জন্য একই সংযোগটি ব্যবহার করতে চান না অন্যটি তৈরি করুন।


0

কোনও বস্তুর তাত্ক্ষণিক করার জন্য ক্লাসিক পদ্ধতিটি হ'ল

$Object=new ClassName();

পিএইচপি-র নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করে পরিবর্তনশীল নাম থেকে গতিশীল কোনও অবজেক্ট তৈরি করার ক্ষমতা রয়েছে:

$Object=new $classname;

যেখানে ভেরিয়েবল $ শ্রেণীর নামটিতে ক্লাস ওয়ানের নাম অন্তর্ভুক্ত করতে চায়।

ক্লাসিক অবজেক্ট ফ্যাক্টরিং এর মত দেখতে হবে:

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

এবং আপনি যদি getInstance ('পণ্য') ফাংশনটি কল করেন তবে এই কারখানাটি পণ্য অবজেক্ট তৈরি করবে এবং ফিরিয়ে দেবে। অন্যথায় যদি আপনি getInstance ('গ্রাহক') ফাংশন কল করেন তবে এই কারখানাটি গ্রাহক ধরণের অবজেক্ট (গ্রাহক () শ্রেণি থেকে তৈরি) তৈরি এবং ফিরিয়ে আনবে।

গতিশীল ইনস্ট্যানটিশনের জন্য ভেরিয়েবলের মান হিসাবে 'প্রডাক্ট' বা 'গ্রাহক' (বিদ্যমান শ্রেণীর সঠিক নাম) প্রেরণ করতে পারে এমন আর কোনও দরকার নেই:

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

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

0

রেকর্ডটির জন্য, সহজ কথায়, @ পিন্ডতজুহ-এর মতো একটি কারখানা বলেছিল, কোনও বস্তু ফেরায়।

সুতরাং, একটি নির্মাণকারীর সাথে পার্থক্য কি? (এটি একই কাজ করে)

  1. একটি কনস্ট্রাক্টর তার নিজস্ব উদাহরণ ব্যবহার করে uses
  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;
      }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.