web-dev-qa-db-ja.com

簡単に言えば、工場とは何ですか?

ファクトリとは何ですか?なぜ使用したいのですか?

35
user886910

[〜#〜] jdbc [〜#〜] をご存知ですか?これは、すべての(抽象的な)ファクトリーです。これは良い実例です。

_// Factory method. Loads the driver by given classname. It actually returns a 
// concrete Class<Driver>. However, we don't need it here, so we just ignore it.
// It can be any driver class name. The MySQL one here is just an example.
// Under the covers, it will do DriverManager.registerDriver(new Driver()).
Class.forName("com.mysql.jdbc.Driver");

// Abstract factory. This lets the driver return a concrete connection for the
// given URL. You can just declare it against Java.sql.Connection interface.
// Under the covers, the DriverManager will find the MySQL driver by URL and call
// driver.connect() which in turn will return new ConnectionImpl().
Connection connection = DriverManager.getConnection(url);

// Abstract factory. This lets the driver return a concrete statement from the
// connection. You can just declare it against Java.sql.Statement interface.
// Under the covers, the MySQL ConnectionImpl will return new StatementImpl().
Statement statement = connection.createStatement();

// Abstract factory. This lets the driver return a concrete result set from the
// statement. You can just declare it against Java.sql.ResultSet interface.
// Under the covers, the MySQL StatementImpl will return new ResultSetImpl().
ResultSet resultSet = statement.executeQuery(sql);
_

コードにJDBCドライバー固有のimportを1行含める必要はありません。 _import com.mysql.jdbc.ConnectionImpl_などを実行する必要はありません。 _Java.sql.*_に対してすべてを宣言する必要があります。 connection = new ConnectionImpl();を自分で行う必要はありません。標準のAPIの一部として抽象ファクトリから取得する必要があります。

JDBCドライバーのクラス名を外部で構成できる変数(例:プロパティファイル)にし、ANSI互換のSQLクエリを作成すると、すべてのJavaアプリケーションを書き換え、再コンパイル、再構築、再配布する必要がなくなります。世界が知っている単一のデータベースベンダーやJDBCドライバ。必要なJDBCドライバーJARファイルをランタイムクラスパスにドロップし、いくつかの(プロパティ)ファイルで構成を提供するだけで、DBを切り替えたり、アプリを再利用したりするときに、Javaコードの行を変更する必要はありません。別のDB。

それがインターフェースと抽象ファクトリーの力です。

別の既知の実世界の例は、Java EEです。 「JDBC」を「Java EE」に、「JDBCドライバー」を「Java EEアプリケーションサーバー」に置き換えます(WildFly、TomEE、GlassFish、Libertyなど)。

以下も参照してください。

39
BalusC

ファクトリデザインパターンは、実行時にオブジェクトの複数のインスタンスを作成する必要がある状況で理想的です。各インスタンスを明示的に作成する代わりに、多くのインスタンスを初期化できます。さらに、複数回再利用できる複雑な作成コードをカプセル化できます。

例:

public class Person {
    int ID;
    String gender;
    public Person(int ID,String gender){
        this.ID=ID;
        this.gender=gender;
    }
    public int getID() {
        return ID;
    }
    public String getGender() {
        return gender;
    }
}
public class PersonFactory{
    public static Person createMale(int id){
        return new Person(id,"M");
    }
    public static Person createFemale(int id){
        return new Person(id,"F");
    }
}
public class factorytest{
    public static void main(String[]args){
        Person[] pList= new Person[100];
        for(int x=0;x<100;x++){
            pList[x]=PersonFactory.createMale(x);
        }
    }
}

この例では、性別の初期化パラメーターの詳細をカプセル化し、PersonFactoryにcreateMaleまたはcreate Female Personオブジェクトを要求するだけです。

25
eabraham

簡単に言えば、Factoryは、OOcreatingを扱う設計パターンです。作成するオブジェクトの正確なクラスを指定しないオブジェクト。

それを使用する十分な理由は明確に定義されています wikipediaで

オブジェクトの作成には、多くの場合、構成するオブジェクトに含めるのに適さない複雑なプロセスが必要です。オブジェクトの作成により、コードが大幅に重複したり、構成オブジェクトにアクセスできない情報が必要になったり、十分なレベルの抽象化が提供されなかったり、構成オブジェクトの問題の一部にならない場合があります。ファクトリメソッドデザインパターンは、オブジェクトを作成するための個別のメソッドを定義することによってこれらの問題を処理します。サブクラスは、オーバーライドされて、作成される製品の派生型を指定できます。

25
Saket

工場とは?

Wikipedia 詳細に説明します

多くのGoFパターンの例について、伝説的な BalusC over here からの回答も参照してください
簡単な言葉で言えば、Factoryは、コードで使用できるオブジェクトを作成\初期化\割り当てます。
例:人物の抽象クラスまたはインターフェース、あるいは具体的なクラスさえあり、それを他のクラスで宣言する場合。 private person;それは、そのオブジェクトが宣言されているが作成されていないということです。このオブジェクトを作成するには、新規またはいくつかの依存関係注入またはファクトリーを使用します(ロケーターなどの他のオプションもあります)。

なぜ使用したいのですか?

今、あなたは特定のタイプの人を必要とするかもしれません(例:教師、または人でさえ、異なる構成などに基づいて異なる移植をしているかもしれません)ファクトリーパターンがこれを処理します。特定のクラスを使用する必要があります。

5
Shahzeb

Factory は、他のオブジェクトを作成するためのオブジェクトです。

インスタンス化ロジックをクライアントに公開せずにオブジェクトを作成します。

オブジェクトのインスタンス化ロジックをクライアント/呼び出し元に公開したくない場合は、このパターンを使用します

関連記事:

設計パターン:ファクトリvsファクトリメソッドvs抽象ファクトリ

ファクトリパターンと抽象ファクトリパターンの基本的な違いは何ですか?

3
Ravindra babu

ファクトリはオブジェクトであり、オブジェクトを作成します。一般的な使用法には次の2つの場合があります。

  • 具体的なオブジェクトの選択をファクトリーに委任したいとき-例えばそれは既存のオブジェクトを返すこともあり(Integer.valueOf()、いわゆるファクトリメソッドを参照)、いくつかの条件に応じて具体的な実装を選択することもできます。指定された引数または事前定義されたオプション( Java API for XML ProcessingXPathFactoryクラスを参照)
  • 普遍的な仕事にもっと柔軟性を求める場合。メソッドまたはコンストラクターを引数として渡すことはできません(まあ、あなたはcanですが、リフレクションは最低です)。そのため、具体的なファクトリーをオブジェクトソースとして使用します(例SomeFactory<T>ジェネリックメソッド)。
3