質問
この混乱さく、最も簡単どのようにするのですか?振りご説明さんお母さんと一人でほぼてください。
解決
は工場はオブジェクトを作成します。だから、あなたが構築したい場合は、
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();
あなたがクラスを変更したい場合、本当の利点があります。我々は別のクラスCに渡したいとしましょう。
class Factory_New extends Factory{
public function buildC(){
return new ClassD;
}
}
または新しいClassBの:
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');
ファクトリメソッドの実装は、新しいインスタンスを作成し、それを返します。
あなたが複数のリソースを扱う、高レベルの抽象化を実装したい場合は、出荷時のデザインパターンは非常に良いです。
レッツ・別のセクションにこれを破るます。
は、抽象化とあなたのクラスのユーザーは、クラス定義で実装されてきたものを気にする必要はありませんを実装する必要があるとします。
彼/彼女は自分のクラスのメソッドを使用することを心配する必要はあります。
例えば。あなたは、あなたのプロジェクト
のための2つのデータベースを持っています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
・ホープ、この意志の助けを借りています。
一般的にはA「工場」は何かを生成します:オブジェクト指向プログラミングの場合は、「工場のデザインパターンは、」オブジェクトを生成します。
。これは問題ではない、それはPHPでいた場合、C#またはその他のオブジェクト指向言語ます。
ファクトリーデザインパターン(ファクトリパターン)疎結合のためです。工場の意味のように、最終的なユーザに工場(商品データ)のデータ。この方法によって、工場では、データのソースとデータのプロセス間の緊密な結合を壊します。
工場がちょうどまたは複数のオブジェクトを生成します。
あなたはMySQLの接続を構築する工場を持っていることがあります。
この答えは、他のポストとの関係であるダニエル・ホワイトは、工場出荷時のパターンを使用してMySQLの接続を作成するためのファクトリを使用することを特徴とする。
あなたが同じ接続を使用すると、MySQLの接続のために、私はむしろ、シングルトンパターンを使用します データベースにアクセスするための別のものを作成していない。
は、オブジェクトをインスタンス化するための古典的なアプローチがある:
$Object=new ClassName();
PHPは動的に次の構文を使用して、変数名からオブジェクトを作成する機能があります:
$Object=new $classname;
変数$クラス名がインスタンス化するクラス1欲求の名前が含まれています。
だから、古典的なオブジェクトのファクタリングは次のようになります。
function getInstance($classname)
{
if($classname==='Customer')
{
$Object=new Customer();
}
elseif($classname==='Product')
{
$Object=new Product();
}
return $Object;
}
あなたはProductオブジェクトを作成して返します。この工場機能のgetInstance(「製品」)を呼び出した場合。お電話の場合はそうでないのgetInstance(「顧客」)は、この工場が作成し、リターンカスタマー型オブジェクト(作成されたお客様からの()クラス)になる機能します。
のための必要はありませんつまり、それ以上、一つは動的なインスタンス化のための変数の値として「製品」や「顧客(既存のクラスの正確な名前)を送信することができます:
を$classname='Product';
$Object1=new $classname; //this will instantiate new Product()
$classname='Customer';
$Object2=new $classname; //this will instantiate new Customer()
の記録や、工場のような@Pindatjuh言を返すオブジェクトです。
では、どのコンストラクタ?(これは同じです)
- コンストラクタを利用し独自のインスタンス.
- 何とかして欲しいところでもより高度ならないようにしたい膨張のオブジェクト(または追加の依存関係).
コンストラクタが呼び出されるの各インスタンスが作成されます。あいます。
例えば、ということかとなっていて、オブジェクトを生成し、クラスの口座において、データベースからファイルとして使用してテンプレートを作成します。
コンストラクタを使用:
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;
}