首先,请原谅我,如果这真的是一个愚蠢的问题,我只是试着学习这门语言的核心。我正在阅读有效的Java,第一章讨论静态工厂方法与构造函数。他们的优点和缺点。让我感到困惑的几件事是:
谢谢。
发布于 2010-11-02 15:57:32
静态工厂方法返回的对象的类是非公共的-它到底意味着什么?
这意味着静态工厂方法返回的对象的实际类可以是声明类型的子类,并且这个子类不必是公共的。这只是客户端代码不应该关心的另一个实现细节。
与构造函数不同,静态工厂方法不需要每次创建一个新对象>每次调用它们的时间--这是如何发生的?我调用工厂方法只是为了获得一个新的对象,我们是否在工厂方法中放置了一个检查对象是否已经存在?
是的,这是一种可以做到的方法。但实际上,任何事情都是可能的。
发布于 2010-11-02 16:17:50
首先,赞扬您在Java照明中的选择:Bloch的书是一本很好的入门书。
要回答第二个问题(与构造函数静态工厂方法不同,每次调用静态工厂方法都不需要创建新对象),重要的是要认识到Bloch在这里说的是,对于静态工厂,您可以任意选择:返回新对象或返回预先存在的对象。这完全取决于你想做什么。
例如,假设您有一个非常简单的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 );再次,一个真正的人为的例子,但希望它能帮助你或多或少地了解布洛赫在这一点上的成就。
其他的答案都很好--我只是觉得,作为一个初学者,有时候看到一些实际的代码会有帮助。
发布于 2010-11-02 15:59:13
当您使用new关键字时,开发人员知道JDK将创建该对象的一个新实例。作者说的是,当您使用静态方法时,开发人员不再知道该方法是创建新实例还是可能执行其他操作。其他方法可以是重用缓存的数据、对象池、创建私有实现和返回类的子类。
https://stackoverflow.com/questions/4079456
复制相似问题