工場を使用する主な理由があります:
1.オブジェクトの作成を抽象化します
これは、単体テストに関して、アーキテクチャで最も有用な構造の1つです。インスタンスの作成をファクトリに任せることで、テスト時にモックを簡単に導入できます。
また、追加の利点として、使用するクラスの名前と密接に結びついているわけではありません。
2.インスタンス化を簡素化します
ここでは、考慮しなければならない2つの側面があります。まず、ある条件に基づいてさまざまなオブジェクトをインスタンス化する機能は、 helmbertの回答 (彼の場合は+1)ですでに十分に説明されています。
もう1つのケースは、より複雑なドメインオブジェクトをインスタンス化する場合です。このようなもの:
$employees = new EmployeeCollection;
$address = new Location;
$class = $type . `Company`;
$company = new $class( $employee, $address );
のインスタンスを作成する前に、やるべきことがたくさんありますHoldingCompany
。しかし、このプロセス全体は工場で行うことができます。特に、ドメインオブジェクトファクトリが正しく実装されたDICをうまく利用している場合(これは非常にまれですが)。
3.アプリケーションでリリースされる前にオブジェクトを準備します
コンストラクターで計算を実行しないでください。そのコードをテストすることは不可能になります。コンストラクターには、単純な変数の割り当てのみを含める必要があります。
ただし、これにより問題が発生します。インスタンス化されたオブジェクトを他のコード構造で処理できるようにする前に、いくつかの論理演算を実行する必要がある場合があります。初心者として、私たちは通常コンストラクターでそれを行います。しかし、今どこにそれを置くのですか?
これは、工場が救助に来るところです。
public function create( $name )
{
$instance = new $name;
if ( is_callable($instance, false, 'prepare') )
{
$instance->prepare();
}
return $instance;
}
これで、を使用する$factory->create('foobar')
と、オブジェクトが完全に準備されて使用できるようになります。