これは私を混乱させます。最も簡単な言葉で言えば、それは何をしますか? 母親や誰かに説明しているふりをしてください。
10 に答える
ファクトリはオブジェクトを作成します。したがって、ビルドしたい場合は
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();
本当の利点は、クラスを変更したい場合です。別の ClassC を渡したいとしましょう。
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');
ファクトリ メソッドの実装により、新しいインスタンスが作成され、それが返されます。
オブジェクトをインスタンス化する古典的なアプローチは次のとおりです。
$Object=new ClassName();
PHP には、次の構文を使用して、変数名からオブジェクトを動的に作成する機能があります。
$Object=new $classname;
変数 $classname には、インスタンス化するクラスの名前が含まれています。
したがって、従来のオブジェクト ファクタリングは次のようになります。
function getInstance($classname)
{
if($classname==='Customer')
{
$Object=new Customer();
}
elseif($classname==='Product')
{
$Object=new Product();
}
return $Object;
}
getInstance('Product') 関数を呼び出すと、このファクトリは Product オブジェクトを作成して返します。それ以外の場合、getInstance('Customer') 関数を呼び出すと、このファクトリは Customer タイプ オブジェクト (Customer() クラスから作成) を作成して返します。
もうその必要はありません。動的インスタンス化の変数の値として、'Product' または 'Customer' (既存のクラスの正確な名前) を送信できます。
$classname='Product';
$Object1=new $classname; //this will instantiate new Product()
$classname='Customer';
$Object2=new $classname; //this will instantiate new Customer()
一般に、「ファクトリ」は何かを生成します。オブジェクト指向プログラミングの場合、「ファクトリ デザイン パターン」はオブジェクトを生成します。
それが PHP、C#、またはその他のオブジェクト指向言語であるかどうかは問題ではありません。
この回答は、Daniel White が factory パターンを使用して MySQL 接続を作成するために factory を使用すると述べた他の投稿に関連しています。
MySQL接続の場合、別の接続を作成せずにデータベースにアクセスするために同じ接続を使用したいので、シングルトンパターンを使用したいと思います。
ファクトリは、1 つまたは複数のオブジェクトを生成するだけです。
MySQL 接続を構築するファクトリがある場合があります。
ファクトリは、アプリケーション コードに関しては、メンテナンスとスケーラビリティを容易にするためのソリューションです。これにより、SOLID が推奨するコード カップリングの問題が解決されます。基本的に、構造の構築/作成を簡素化する方法です。オブジェクト、関数、配列のいずれかです。
構造体を使用するコードをそれらを作成するコードから分離し、オブジェクト/構造体を返す限り、次の 4 つのいずれかのファクトリを使用しています。
- 工場方式
- 抽象工場
- 静的ファクトリー
- シンプルファクトリー
主な違いは、ファクトリ メソッドと抽象ファクトリにあります。
1 つは明確に定義された要素のリストからオブジェクト/構造を生成し、もう 1 つは独自のファクタリング戦略を使用してオブジェクトの青写真を生成します。
1 つは具体的な要素を生成し、もう 1 つは型を生成します。
記録のために、簡単に言えば、@ Pindatjuh のようなファクトリはオブジェクトを返します。
では、コンストラクターとの違いは何ですか? (それは同じことをします)
- コンストラクターは独自のインスタンスを使用します。
- より高度なものにしたいので、オブジェクトを肥大化させたくない(または依存関係を追加したくない)。
コンストラクターは、各インスタンスが作成されるときに呼び出されます。時々、あなたはそれを望まないことがあります。
たとえば、Account クラスのオブジェクトを作成するたびに、データベースからファイルを読み取り、それをテンプレートとして使用するとします。
コンストラクターの使用:
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;
}