Kev*_*oyd 1 java methods factory
我正在阅读Joshua Bloch的" Effective Java Programming Language Guide ".
他解释说静态工厂方法可以用来避免不必要的重复对象.
我对此并不十分了解.
谁能解释一下?
一个现实世界的例子:
Java支持原始类型和对象类型来表示字节.将基元转换为对象时,可以执行以下操作:
Byte b = new Byte( (byte) 65);
Run Code Online (Sandbox Code Playgroud)
这会为每次通话创建一个新实例.相反,你做:
Byte b = Byte.valueOf( (byte) 65);
Run Code Online (Sandbox Code Playgroud)
在每次调用时,方法valueOf()将返回表示字节值65的Byte对象的相同实例.
在10000次调用之后,第一个示例将创建10000个对象,而第二个示例仅创建一个,因为Byte类具有Byte对象的内部缓存,表示-128和127之间的所有数字.
关于非重复的所有答案似乎都集中在单例模式上,这是非重复的一个很好的例子,但在一般情况下使用的模式不好.在我看来,给定的应用程序中应该有零到一个单例,偏好为零.但是,这与不创建不必要的对象几乎没有关系.
请考虑一个必须创建大量Date对象的应用程序.正在制作如此多的Date对象,Date对象的构造对性能产生了负面影响.因此,在调用Date对象的构造函数时,代码将被重构为仅通过工厂方法创建日期.在此工厂方法中,将检查Map以查看是否已创建所请求的日期.如果是,则从Map返回相同的对象.否则创建一个新的,放入Map并返回.
让您感到困惑的是如何通过调用工厂方法来防止创建重复对象.只是通过调用工厂方法并没有真正改变任何东西.调用工厂允许的是代码接管并做出关于创建对象的决定.在调用new时,不能做出这样的决定.
另请参阅此问题,以了解有关模式及其可用性的更多信息.
当您调用构造函数时,它总是会返回一个新对象(除非抛出异常).静态工厂方法或任何类型的工厂不必总是返回新对象.例如,getInstance()传统的Singleton设计模式上的方法是一种始终返回完全相同的对象的工厂方法.有些情况下,有时你想要做这种事情,无论是强制执行一个对象只能实例化一次,还是创建某种对象池等.一般来说,我认为这是使用的一个边缘原因静态工厂方法.主要目的是创建名称很好的伪构造函数.
这是一个使用静态工厂方法制作名称很好的伪构造函数的(有些愚蠢)示例.考虑这个课程:
class Person {
public Person(Role role) {
setRole(role);
}
...
}
Run Code Online (Sandbox Code Playgroud)
如果没有静态工厂方法,您可能会执行以下操作:
Person employee = new Person(Role.EMPLOYEE);
Person manager = new Person(Role.MANAGER);
Run Code Online (Sandbox Code Playgroud)
相反,您可以创建静态工厂方法:
class Person {
public static Person newEmployee() {
return new Person(Role.EMPLOYEE);
}
public static Person newManager() {
return new Person(Role.MANAGER);
}
private Person(Role role) {
setRole(role);
}
...
}
Run Code Online (Sandbox Code Playgroud)
而你可能会做这样的事情:
Person employee = Person.newEmployee();
Person manager = Person.newManager();
Run Code Online (Sandbox Code Playgroud)
这可能不是一个好例子,但考虑更复杂的构造函数或具有较少描述性参数的构造函数.有时走工厂方法路线会使代码更清晰.当然有缺点......
至于限制对象创建,请考虑一些奇怪的约束,例如永远不会有多个CEO:
class Person {
private static Person singletonCEO = new Person(Role.CEO);
public static Person newCEO() {
return singletonCEO;
}
...
}
Run Code Online (Sandbox Code Playgroud)
以及如何创建它:
Person ceo1 = Person.newCEO();
Person ceo2 = Person.newCEO();
assertThat(ceo1, is(ceo2)); // JUnit 4.x
Run Code Online (Sandbox Code Playgroud)
我希望这些例子有所帮助.