এটি আমাকে বিভ্রান্ত করে, সর্বাধিক সহজ ভাষায় এটি কী করে? আপনি আপনার মাকে বা প্রায় দয়া করে কারও কাছে ব্যাখ্যা দিচ্ছেন এমন ভান করুন।
এটি আমাকে বিভ্রান্ত করে, সর্বাধিক সহজ ভাষায় এটি কী করে? আপনি আপনার মাকে বা প্রায় দয়া করে কারও কাছে ব্যাখ্যা দিচ্ছেন এমন ভান করুন।
উত্তর:
একটি কারখানা একটি বস্তু তৈরি করে। সুতরাং, আপনি যদি নির্মাণ করতে চান
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
$obj = $factory->build();
বেশি $obj = new whateverClass();
? এছাড়াও, অন্য ক্লাসে (ক্লাসজেড বলুন) যা ক্লাসএ এর ডেটার উপর নির্ভর করে, ক্লাসজেডে আপনি কারখানার পদ্ধতিটি কোথায় ব্যবহার করবেন? আপনি এখনও এখনও ক্লাসের (ক্লাসএ) মধ্যে একটি ক্লাস (ক্লাস জেড) ইনস্ট্যান্ট করছেন, যার অর্থ কোনও পরীক্ষা নেই। উদাহরণস্বরূপ কারখানাটি new
কেবল ব্যবহারের পরিবর্তে কোনও পদ্ধতির মাধ্যমে করার জন্য কোডের বোঝা বলে মনে হচ্ছে new
।
বাস্তব জীবনের কারখানার মতো এটি কিছু তৈরি করে এবং তা ফেরত দেয়।
এরকম কিছু কল্পনা করুন
$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
আশা করি এটি সাহায্য করবে।
একটি কারখানা কেবল একটি বস্তু বা বস্তু উত্পন্ন করে।
আপনার একটি কারখানা থাকতে পারে যা মাইএসকিউএল সংযোগ তৈরি করে।
এই উত্তরটি অন্য পোস্টের সাথে সম্পর্কিত যেখানে ড্যানিয়েল হোয়াইট ফ্যাক্টরি প্যাটার্ন ব্যবহার করে মাইএসকিউএল সংযোগ তৈরির জন্য ফ্যাক্টরি ব্যবহার করতে বলেছিলেন।
মাইএসকিউএল সংযোগের জন্য আমি সিঙ্গলটন প্যাটার্নটি ব্যবহার করব কারণ আপনি ডাটাবেসটি অ্যাক্সেস করার জন্য একই সংযোগটি ব্যবহার করতে চান না অন্যটি তৈরি করুন।
কোনও বস্তুর তাত্ক্ষণিক করার জন্য ক্লাসিক পদ্ধতিটি হ'ল
$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()
রেকর্ডটির জন্য, সহজ কথায়, @ পিন্ডতজুহ-এর মতো একটি কারখানা বলেছিল, কোনও বস্তু ফেরায়।
সুতরাং, একটি নির্মাণকারীর সাথে পার্থক্য কি? (এটি একই কাজ করে)
প্রতিটি উদাহরণ তৈরি করা হলে কনস্ট্রাক্টরকে ডাকা হয়। কখনও কখনও আপনি এটি চান না।
উদাহরণস্বরূপ, ধরা যাক যে আমি যখনই ক্লাস অ্যাকাউন্টের কোনও বস্তু তৈরি করি, তখন আমি ডাটাবেস থেকে একটি ফাইল পড়ি এবং এটি টেম্পলেট হিসাবে ব্যবহার করি।
কনস্ট্রাক্টর ব্যবহার:
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;
}