ファクトリメソッドを読みました。インスタンス化をサブクラスに委任する方法を提供することを理解しています。しかし、実際のシナリオで考えられる使用法を理解できませんでした。
私が読んだものに関連付けることができるように、ファクトリメソッドパターンをどのように使用できるかを示す典型的な例を誰かに挙げてもらえますか?
ファクトリメソッドパターンが最良の解決策である問題ステートメントは、それを明確にするのに十分です。
ファクトリメソッドを読みました。インスタンス化をサブクラスに委任する方法を提供することを理解しています。しかし、実際のシナリオで考えられる使用法を理解できませんでした。
私が読んだものに関連付けることができるように、ファクトリメソッドパターンをどのように使用できるかを示す典型的な例を誰かに挙げてもらえますか?
ファクトリメソッドパターンが最良の解決策である問題ステートメントは、それを明確にするのに十分です。
ファクトリデザインパターンを実装するクラスは、複数のクラス間のブリッジとして機能します。SQLServerやOracleなどの複数のデータベースサーバーを使用する例を考えてみましょう。SQL Serverデータベースをバックエンドとして使用してアプリケーションを開発しているが、将来的にバックエンドデータベースをoracleに変更する必要がある場合、ファクトリデザインパターンに従ってコードを記述していない場合は、すべてのコードを変更する必要があります。
ファクトリデザインパターンでは、これを実現するために必要な作業はごくわずかです。ファクトリデザインパターンを実装するクラスがあなたの世話をし、あなたの負担を軽減します。データベースサーバーから切り替えても、まったく気になりません。構成ファイルに小さな変更を加えるだけです。
静的に作成されたphpコードの例:
interface DbTable
{
public function doSomething(): void;
}
class MySqlTable implements DbTable
{
public function doSomething(): void
{ }
}
class OracleTable implements DbTable
{
public function doSomething(): void
{ }
}
class TableFactory
{
public static function createTable(string $type = null): DbTable
{
if ($type === 'oracle') {
return new OracleTable();
}
return new MySqlTable(); // default is mysql
}
}
// client
$oracleTable = TableFactory::createTable('oracle');
$oracleTable->doSomething();
それをより動的にするために(後で変更を少なくする):
interface DbTable
{
public function doSomething(): void;
}
class MySqlTable implements DbTable
{
public function doSomething(): void
{ }
}
class OracleTable implements DbTable
{
public function doSomething(): void
{ }
}
class TableFactory
{
public static function createTable(string $tableName = null): DbTable
{
$className = __NAMESPACE__ . $tableName . 'Table';
if (class_exists($className)) {
$table = new $className();
if ($table instanceof DbTable) {
return $table;
}
}
throw new \Exception("Class $className doesn't exists or it's not implementing DbTable interface");
}
}
$tbl = TableFactory::createTable('Oracle');
$tbl->doSomething();
私が現在開発しているAPIから:
WebGalleryFactory factory = WebGalleryFactory.newInstance (WebGalleryType.PICASA);
WebAlbum album = factory.createAlbum (title, description);
この例では、ファクトリメソッドを使用して特定のタイプの抽象ファクトリ(例ではPICASA)を作成します。
これらの2つのパターンは、しばしば一緒に使用されます。
Zend_DbはそれをZend_Db_Adapterクラスで使用して、構成オブジェクトから渡されたデータベース設定に基づいてさまざまな種類のデータベースオブジェクトを作成できるようにします。
.NET基本クラスライブラリ(BCL)の1つの例は、 Control.CreateControlsInstanceです。これは、(Windowsフォーム)Controlクラスの他の多くのメンバーによって使用されます。
この保護されたメソッドをオーバーライドして、カスタムコントロールを実装する場合など、独自のコントロールのコレクションを提供できます。