什么时候考虑使用静态工厂方法

在Java中对于类来说,要实例化一个对象,最简单的方式就是通过new构造器来实现。而除了new构造器还有一种很常见的方法,就是静态工厂方法。

请先看这段代码:

public static String valueOf(int i) {
    return Integer.toString(i);
}

在Java的包装类中存在大量的valueOf静态方法,这些方法就是静态工厂方法。通过静态工厂方法可以直接返回这个类的对象。注意,静态工厂方法与设计模式中的工厂方法模式是不同的,不要搞混淆了。

那么,已经有了new构造器的方式来创建对象了,为什么还要采用静态工厂方法呢?

因为静态工厂方法具有这些优势:

1、静态工厂方法是有名称的,更易于阅读。例如,构造器People(String name, int age, boolean isMale) 返回一个People可能是男性,根据isMale来区分,如果用名称People.createMale(String name, int age)的静态工厂方法来表示,就可以很清楚的知道返回的是男性。

2、静态工厂方法可以返回类型的任何子类型对象。这是一个灵活的使用方式,在vert.x框架中,就大量的采用了这种方式。例如BodyHandler.create返回的是BodyHandlerImpl的对象,Router.router返回的是RouterImpl对象。

3、静态工厂方法可以在创建参数化类型实例的时候,使代码更简洁。

请看下面这段代码:

public class MyMap<K, V> {
    K key;
    V value;
}

一般会这样去构造一个MyMap对象:

MyMap<String, List<String>> map = new MyMap<String, List<String>>();

那么,在稍微的修改一下MyMap类的代码,加一个静态工厂方法:

public static <k,V> MyMap<k, V> newInstance() {
    return new MyMap<k ,V>();
}

你就可以用下面这种更简洁的方法去创建对象了:

MyMap<String, List<String>> map = MyMap.newInstance();

自jdk 1.8后,第3个优点已经不明显了,因为jdk可以自动推导参数化类型了。在不增加静态工厂方法的情况下还可以这样写:

MyMap<String, List<String>> map = new MyMap<>();

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:什么时候考虑使用静态工厂方法

本文地址:https://jizhong.plus/post/2020/04/static-factory-method.html