静态工厂方法和设计模式中的工厂方法模式不同。本条目所指的静态工厂并不直接对应于设计模式中的工厂方法ss
例如,将boolean基本类型转换为Boolean对象的引用
public static Boolean valueOf(boolean b)
{
return b ? Boolean.TRUE : Boolean.FALSE;
}
以下是其优势:
-
有名字
-
不必再每次调用他们的时候创建一个新对象
将创建好的实例对象进行缓存
静态工厂方法能够为重复的调用返回相同对象,这样有助于累总能严格控制在某时刻哪些实例应该存在。这样的类称作,实例受控的类
-
可以返回原返回类型的任何子类对象
-
所返回的对象的类可以随着每次调用而发生变化,这取决于静态方法的参数值
缺点
-
类不含有共有或者受保护的构造器,就不能被子类实例化
-
程序猿很难发现他们
以下总结工厂方法的惯用名称
from 类型转化方法:他只有一个单参数,返回该类型相对应的实例
Date.from(instant)
of 聚合方法 带有多个参数,返回该类型的一个实例,把他们合并起来
enum Num{
ONE,TWO,THREE
}
public static void main(String[] args) {
EnumSet<Num> nums = EnumSet.of(Num.ONE, Num.TWO);
}
valueOf 比from和of更繁琐的一种替换方法
BigInteger bigInteger = BigInteger.valueOf(Integer.MAX_VALUE);
instatce或者getInstance 返回的实例是通过方法参数来描述的,但是不能说于参数具有同样的值
例如 单例模式
create或者newInstance 像instance或者getInstance一样,但create或者newInstance能够确保每次调用都能返回一个新的实例
例如 多例模式
getType 像getInstance一样,但是在工厂方法处于不同的类中的时候使用。Type表示工厂返回对象的类型
FileStore path = Files.getFileStore(Paths.get("path"));
newType 像newInstance一样,但是在工厂方法处于不同的类中的时候使用。Type表示工厂返回对象的类型
type getType和newType的简版,例如:
Stack<String> stack = new Stack<>();
stack.push("1");
stack.push("2");
ArrayList<String> list = Collections.list(stack.elements());