static factory"メソッドとは何ですか?
データベース接続に直接アクセスすることは、リソースを消費するので避けています。そこで、スタティックなファクトリ・メソッド getDbConnection
を使用して、制限値を下回っている場合は接続を作成します。 それ以外の場合は、"spare"接続を提供しようとしますが、存在しない場合は例外で失敗します。
public class DbConnection{
private static final int MAX_CONNS = 100;
private static int totalConnections = 0;
private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();
private DbConnection(){
// ...
totalConnections++;
}
public static DbConnection getDbConnection(){
if(totalConnections < MAX_CONNS){
return new DbConnection();
}else if(availableConnections.size() > 0){
DbConnection dbc = availableConnections.iterator().next();
availableConnections.remove(dbc);
return dbc;
}else {
throw new NoDbConnections();
}
}
public static void returnDbConnection(DbConnection dbc){
availableConnections.add(dbc);
//...
}
}
コンストラクタとは異なり、名前を持つことでコードを明確にすることができます。
- 起動のたびに新しいオブジェクトを作成する必要がない - オブジェクトは オブジェクトはキャッシュされ、必要に応じて再利用することができます。
- 戻り値の型のサブタイプを返すことができる - 特に、以下のことが可能です。 特に、呼び出し元が実装クラスを知らないオブジェクトを返すことができます。 これは多くのフレームワークにおいて、非常に貴重で広く使われている機能です。 これは、静的なファクトリメソッドの戻り値としてインターフェースを使用する多くのフレームワークにおいて、非常に貴重で広く使用されている機能です。
http://www.javapractices.com/topic/TopicAction.do?Id=21][1]より
ファクトリーメソッドとは、オブジェクトのインスタンス化を抽象化したメソッドです。 一般的にファクトリーは、あるインターフェイスを実装したクラスの新しいインスタンスが必要だが、その実装クラスがわからない場合に役立ちます。
これは、関連するクラスの階層を扱うときに便利で、GUIツールキットがその良い例です。 各ウィジェットの具体的な実装のコンストラクタへの呼び出しを単純にハードコーディングすることもできますが、ツールキットを別のものに変えようとすると、変更すべき箇所がたくさんあります。 ファクトリーを使うことで、変更が必要なコードの量を減らすことができます。