アブストラクトファクトリーってなに?
生成に関するパターンですね。根本的な考え方はビルダーと似ています。複雑な手順のオブジェクト生成をラップしようという考え方です。
アブストラクトファクトリーの構造
- Factory - 部品を作る向上
- Product - 部品を当て込まれる対象
<?php
class House {
private $_Door = null;
private $_Window = null;
public function setDoor ( $door ) {
$this->_Door = $door;
}
public function setWindow ( $window ) {
$this->_Window = $window;
}
}
interface IHouseFactory {
public function createDoor ();
public function createWindow ();
}
class JapaneseHouseFactory implements IHouseFactory {
public function createDoor () {
return '木の門';
}
public function createWindow () {
return '障子';
}
}
class ForeignHouseFactory implements IHouseFactory {
public function createDoor () {
return '木のドア';
}
public function createWindow () {
return 'ガラスの窓';
}
}
$factory1 = new JapaneseHouseFactory ();
$factory2 = new ForeignHouseFactory ();
$jphouse = new House ();
$jphouse->setDoor ( $factory1->createDoor () );
$jphouse->setWindow ( $factory1->createWindow () );
$fhouse = new House ();
$fhouse->setDoor ( $factory2->createDoor () );
$fhouse->setWindow ( $factory2->createWindow () );
var_dump ( $jphouse );
var_dump ( $fhouse );
このファクトリで縛ることによって木の門とガラスの窓のようなおかしな組み合わせでオブジェクトが設定されることがなくなり、安全に作れるようになりましたね。今回は複雑さを減らすために文字列で全てのプロパティを設定しましたがcreateDoorが返すのが、また複雑な生成を経たオブジェクトの場合もあります。そのようなケースを想像すると、もっとこのパターンの意義も伝わり易いのではないかと思います。
実際どうなの?
有名な適用例としてはDOMでしょうか。その他でもしょっちゅう使われていますね。また、このパターンのもうひとつのメリットとしては、Factoryがオブジェクトなので引数等で渡し易い点です。次回に説明するFactoryMethodと組み合わせることでUnitテストが行い易くなります。