首先给出结论:创建对象的时候考虑用静态工厂方法代替构造器
静态工厂方法:又叫简单工厂模式,与工厂模式不同,其是通过专门定义一个类来负责创建其他类的实例,其实例通常拥有共同父类,其普遍实现主要依靠Java的反射机制。
举个栗子,以BigInteger中的源码为例:
构造器:
//返回的可能为素数
public BigInteger(int bitLength, int certainty, Random rnd) {
BigInteger prime;
if (bitLength < 2)
throw new ArithmeticException("bitLength < 2");
prime = (bitLength < SMALL_PRIME_THRESHOLD
? smallPrime(bitLength, certainty, rnd)
: largePrime(bitLength, certainty, rnd));
signum = 1;
mag = prime.mag;
}
静态工厂方法,总体功能跟上面的构造器差不多,就是certainty参数这里使用的默认值
//返回的可能为素数
public static BigInteger probablePrime(int bitLength, Random rnd) {
if (bitLength < 2)
throw new ArithmeticException("bitLength < 2");
return (bitLength < SMALL_PRIME_THRESHOLD ?
smallPrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd) :
largePrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd));
}
那为啥创建对象静态工厂方法好呢
- 静态工厂方法有名字BigInteger.probablePrime,看名字就知道这是要干啥
- 不必在每次调用它们的时候都创建一个新的对象,可以进行实例的缓存复用;因为静态工厂方法能够为重复的调用返回相同的对象
- 返回原返回类型任意子类型的对象;
比如,利用基类,返回该类型的子类
public class FoodFactory {
public static Food getFood(String type) {
Food food = null;
try {
food = (Food) Class.forName("info.zhw." + type).newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return food;
}
- 代码简洁
例如: 调用带参数的构造器的时候,必须2次指明参数
Map<String,List<String>> m = new HashMap<String,List<String>>;
对应的使用HashMap提供的静态工厂方法,你只要这么调用:
Map<String,List<String>> m = HashMap.new Instance();
//是不是代码短了很多
静态工厂方法的缺点
- 类如果不含public或者protected修饰的构造器,就不能被子类化
- 与其他的静态方法没有区别
网友评论