美文网首页
创建和销毁对象—静态工厂方法VS构造器

创建和销毁对象—静态工厂方法VS构造器

作者: nico芊祤玖斓 | 来源:发表于2017-11-10 16:59 被阅读17次

首先给出结论:创建对象的时候考虑用静态工厂方法代替构造器

静态工厂方法:又叫简单工厂模式,与工厂模式不同,其是通过专门定义一个类来负责创建其他类的实例,其实例通常拥有共同父类,其普遍实现主要依靠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修饰的构造器,就不能被子类化
  • 与其他的静态方法没有区别

相关文章

网友评论

      本文标题:创建和销毁对象—静态工厂方法VS构造器

      本文链接:https://www.haomeiwen.com/subject/ukebmxtx.html