32

有効な Javaから(項目 1 :コンストラクターの代わりに静的ファクトリ メソッドを検討する):

静的ファクトリ メソッドによって返されるオブジェクトのクラスは、メソッドを含むクラスが作成された時点で存在する必要さえありません。このような柔軟な静的ファクトリ メソッドは、Java Database Connectivity API (JDBC) などのサービス プロバイダー フレームワークの基礎を形成します。サービス プロバイダー フレームワークは、複数のサービス プロバイダーがサービスを実装するシステムであり、システムはクライアントが実装を利用できるようにし、クライアントを実装から切り離します。

メソッドを含むクラスが書かれた時点で、静的ファクトリメソッドによって返されるオブジェクトのクラスは存在する必要さえないという本がなぜ言っているのか、私は特に理解していません。例としてJDBCを使用して説明できますか。

4

2 に答える 2

59

次のようなものを検討してください。

public interface MyService {
  void doSomething();
}

public class MyServiceFactory {
  public static MyService getService() {
    try {
      (MyService) Class.forName(System.getProperty("MyServiceImplemetation")).newInstance();
    } catch (Throwable t) {
      throw new Error(t);
    }
  }
}

このコードを使用すると、ライブラリはサービスの実装について知る必要がなくなります。ライブラリのユーザーは、使用する実装の名前を含むシステム プロパティを設定する必要があります。

これは、あなたが理解していない文が意味するものです: ファクトリ メソッドは、何らかのクラス (システム プロパティ "MyServiceImplementation" に格納されている名前) のインスタンスを返しますが、それがどのクラスであるかはまったくわかりません。それが知っているのは、それが実装MyServiceしていることと、パブリックで引数のないコンストラクターが必要であることだけです (そうでない場合、上記のファクトリは をスローしますError)。

于 2012-08-06T07:13:37.673 に答える
4

システムは、クライアントが実装を利用できるようにし、それらを実装から切り離します。

簡単に言うと、コンパイル時にこれらの JDBC ベンダーの依存関係を追加しません。クライアントは実行時に独自のものを追加できます

于 2012-08-06T07:13:05.110 に答える