まず最初に、あなたが Java-lit を選んだことを称賛します。Bloch の本は優れた入門書です。
2 番目の質問に答えるには (「コンストラクターとは異なり、呼び出されるたびに静的ファクトリー メソッドは新しいオブジェクトを作成する必要はありません」)、ブロッホがここで言っていることは、静的ファクトリーではどちらかのオプションがあることを認識することが重要です。 : 新しいオブジェクトを返すか、既存のオブジェクトを返します。それはすべて、あなたが何をしたいかによって異なります。
たとえば、Money 型の非常に単純な値クラスがあるとします。スタティック ファクトリ メソッドは、おそらく新しいインスタンス、つまり Money の特定の値を持つ新しいオブジェクトを返す必要があります。したがって、次のようになります。
public class Money {
private Money(String amount) { ... } /* Note the 'private'-constructor */
public static Money newInstance(String amount) {
return new Money(amount);
}
}
しかし、リソースを管理するオブジェクトがあり、ResourceManager クラスを介してそのリソースへのアクセスを同期したいとします。その場合、静的ファクトリ メソッドがそれ自体の同じインスタンスをすべての人に返すようにする必要があります。その 1 つのインスタンスがプロセスを制御できるように、全員が同じインスタンスを通過するように強制します。これはシングルトンパターンに従います。このようなもの:
public ResourceManager {
private final static ResourceManager me = new ResourceManager();
private ResourceManager() { ... } /* Note the 'private'-constructor */
public static ResourceManager getSingleton() {
return ResourceManager.me;
}
}
上記の方法により、ユーザーは単一のインスタンスのみを使用できるようになり、管理しているものに誰が (いつ) アクセスできるかを正確に制御できます。
最初の質問に答えるには、次のことを考慮してください (確かに最良の例ではありません。かなりアドホックです)。
public class Money {
private Money(String amount) { ... }
public static Money getLocalizedMoney( MoneyType localizedMoneyType, String amount ) {
switch( localizedMoneyType ) {
case MoneyType.US:
return new Money_US( amount );
case MoneyType.BR:
return new Money_BR( amount );
default:
return new Money_US( amount );
}
}
}
public class Money_US extends Money { ... }
public class Money_BR extends Money { ... }
これを行う方法に注意してください。
Money money = Money.getLocalizedMoney( user_selected_money_type );
saveLocalizedMoney( money );
繰り返しますが、非常に不自然な例ですが、ブロッホがその時点で得ていたものを多かれ少なかれ理解するのに役立つことを願っています.
他の回答は良かったです。初心者として、実際のコードを見ると役立つ場合があると思います。