web-dev-qa-db-ja.com

Factory Methodパターンの実際の例

ファクトリーメソッドを読んだだけです。インスタンス化をサブクラスに委任する方法を提供することを理解しています。しかし、私は実際のシナリオで可能な使用法を理解できませんでした。

誰でも、ファクトリーメソッドのパターンがどのように使用され、私が読んだものと関係があるかを示す1つの典型的な例を示すことができますか?.

ファクトリメソッドパターンが最適なソリューションである問題ステートメントは、それを明確にするのに十分です。

27
devnull

ファクトリデザインパターンを実装するクラスは、複数のクラス間のブリッジとして機能します。 SQL ServerやOracleなどの複数のデータベースサーバーを使用する例を考えてみます。 SQL Serverデータベースをバックエンドとして使用してアプリケーションを開発しているが、将来バックエンドデータベースをOracleに変更する必要がある場合、工場の設計パターンに従ってコードを記述していない場合は、すべてのコードを変更する必要があります。

工場の設計パターンでは、これを達成するためにほとんど作業を行う必要はありません。ファクトリーデザインパターンを実装するクラスがあなたの面倒を見て、あなたの負担を軽減します。データベースサーバーから切り替えても、まったく気になりません。設定ファイルを少し変更するだけです。

48
Sarfraz

PHPコードの例:

interface DbTable
{
    public function create($array);
}

class MySqlTable implements DbTable
{
    public function create($array)
    {
        // add a record to a table on mysql database
    }
}

class OracleTable implements DbTable
{
    public function create($array)
    {
        // add a record to a table on Oracle database
    }
}

class TableFactory
{
    private $dbTypeConfig = 'mysql';

    public function createTable()
    {
        if ($this->dbTypeConfig == 'mysql') {
            return new MySqlTable();
        } elseif ($this->dbTypeConfig == 'Oracle') {
            return new OracleTable();
        }
        return null;
    }
}
8
Mohamad Rostami

私が今開発しているAPIから:

WebGalleryFactory factory = WebGalleryFactory.newInstance (WebGalleryType.PICASA);
WebAlbum album = factory.createAlbum (title, description);

この例では、ファクトリメソッドを使用して、特定のタイプの抽象ファクトリ(例ではPICASA)を作成します。

これら2つのパターンはしばしば一緒に使用されます。

3
Roman

Zend_Dbはそれを Zend_Db_Adapter クラスで使用して、設定オブジェクトから渡されたデータベース設定に基づいて、さまざまな種類のデータベースオブジェクトを作成できるようにします。

3
Tobias Cohen

.NETBase Class Library(BCL)の1つの例は Control.CreateControlsInstance であり、他の多くのメンバーによって使用されています(Windowsフォーム)コントロールクラスの。

この保護されたメソッドをオーバーライドして、独自のコントロールのコレクションを提供できます。カスタムコントロールを実装する場合。

2
Mark Seemann

Simple Factory Design PatternはGangs of Fourには属していません。シンプルファクトリパターンは、提供されるデータに応じて、いくつかの可能なクラスのいずれかのインスタンスを返すパターンの1つです。これは、それが返すクラスが同じ親クラスとメソッドを持っていることを意味しますが、それぞれが異なる種類のデータに対して異なる方法でタスクを実行します。 これは実際の例を含む完全な投稿です

0
Anil Sharma