Прежде всего, спасибо вам за ваш выбор в освещении Java: книга Блоха - это превосходный учебник.
Чтобы ответить на ваш второй вопрос («в отличие от конструкторов статические фабричные методы не являютсятребуется создавать новый объект каждый раз, когда они вызываются »), важно понимать, что Блох говорит здесь о том, что со статической фабрикой у вас есть опция : либо возвращение нового объекта, либо возвращениеуже существующий.Все зависит от того, что вы хотите сделать.
Например, предположим, у вас есть действительно простой класс значений типа 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 );
Опять же, действительно надуманный пример, но, надеюсь, он поможет вам увидеть более или менее то, что Блох достиг с этой точки.
Другие ответы были хорошими - я просто думаю,как новичок иногда помогает увидеть какой-то реальный код.