创建和销毁对象
考虑用静态工厂方法代替构造器
- 一般使用构造器
public class Person {
private String name;
public Person(String name){
this.name = name;
}
}
- 使用静态方法
public class Person {
private String name;
private Person(String name){
this.name = name;
}
public static Person newInstance(String name){//静态工厂方法
return new Person(name);
}
}
这样写的优势
- 静态方法有名字
构造器与类名相同,如果构造器的参数本身没有确切的描述正被返回的对象,那么具有适当名字的静态工厂更容易使用,产生的客户端代码也更易于阅读。 - 不必在每次调用的时候都创建一个新对象
1.这使得不可变类,可以使用预先构建好的实例,或者将构建好的实例缓存,重复利用
2.静态工厂方法能够为重复的调用返回相同对象,这样有助于类总能严格控制在某几个时刻哪些实例应该存在--实例受控类
实例受控类可以确保他是一个singleton或者是不可实例化的
public class Person {
private static Person mPerson;
private String name;
private Person(String name){
this.name = name;
}
public static Person newInstance(String name) {//静态工厂方法
if (mPerson != null) {
mPerson = new Person(name);
}
return mPerson;
}
}
- 它可以返回原返回类型的任何子类型的对象
public class Person {
public static Person newInstance(String name) {
return Child.newInstance()
}
}
class Child extends Person{
public static Child newInstance{
return new Child();
}
}
通过代码很容理解这条原则,那么,这样写的好处是什么?
答:隐藏接口的实现类,使得接口的编写和调用更加简洁,API可以返回对象,又不会使得对象的类变成公有
代码举例
public interface Service {
void method();
}
通过一个Service类提供各种接口的实现:
public class Services {
private static final MyService myService = new MyService();
private static final AnotherService anotherService = new AnotherService();
private Services(){}
public static Service getMyService() {//构造器
return myService;
}
public static Service getAnotherService(){//构造器
return anotherService;
}
private static class MyService implements Service{
@Override
public void method() {
//do some things...
}
}
private static class AnotherService implements Service{
@Override
public void method() {
//do some things...
}
}
}
调用
Service mySevice = Services.getMyService();
Service anotherService = Services.getAnotherService();
缺点
- 类没有公有的或者受保护的构造器,不能被子类化。
- 想要查明如何实例化的一个类,非常困难
简而言之,静态工厂方法和公有构造器都各有用处,我们需要理解它们各自的长处。静态工厂通常更加适合,因此切忌第一反应就提供公有构造器,而不优先考虑静态工厂。
网友评论