static なファクトリメソッドを用意し、コンストラクタの代わりに使用することで、インスタンス生成に関するコードをより分かりやすくできることができます。
Ramdom rand = new Random();
BigInteger.probablePrime(500, rand);
上記の BigInteger.probablePrime
は、素数であろう数を返すファクトリメソッドです。
new BigInteger(...)
というコンストラクタを呼び出すよりも、どのような BigInteger
インスタンスを生成しているのかが明確に表現されています。
型変換用のファクトリメソッドなどは、慣習として valueOf
や of
というメソッド名が使用されます。
Boolean b = Boolean.valueOf(true);
Service service = Service.getInstance();
上記の Service.getInstance()
は、新しいインスタンスを生成するようにも実装できますし、効率化のために再利用可能なオブジェクトを返すように実装することもできます。
シングルトンクラスにおいては、効率化のためではなく、同一インスタンスを取得するためにこの形式のファクトリメソッドを用意します。
オブジェクト指向の多態性を活用した設計を行うには、インタフェースによるメソッドアクセスが必要となります。 ファクトリメソッドにより、具象クラスのインスタンス化を隠ぺいすることができるので、呼び出し側では自然とインタフェースを利用したコーディングが行えるようになります。
public static Service createService(ServiceType type) {
switch (type) {
case FOO:
return new FooService()
case BAR:
return new BarService();
default:
return new DefaultService();
}
}
static ファクトリメソッドは、通常の static メソッド(クラスメソッド)と同様の位置づけにあるため、コンストラクタに比べてインスタンス化方法を把握しにくいと言えます。 クラスの Javadoc コメントとして、インスタンス化方法を明示しておく必要があります。