1.用静态工厂方法避免每次调用时都创建新对象
如:
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
用
Boolean bool = Boolean.valueOf(true);
替代
Boolean bool=new Boolean(true);
2.可以返回原返回任何类型的子类
如:
public class ParentClass {
public static ParentClass getInstance() {
return new AChildClass();
// return new BChildClass();
// return new ParentClass();
}
}
class AChildClass extends ParentClass {
}
class BChildClass extends ParentClass {
}
3.返回对象的类可以随静态工厂方法的参数值改变
如:
public class Student {
public static Student getInstance(String studentName) {
switch (studentName) {
case "XiaoMing":
return new XiaoMing();
case "XiaoHua":
return new XiaoHua();
default:
return null;
}
}
}
class XiaoMing extends Student {
}
class XiaoHua extends Student {
}
结合全局变量和泛型:
public class Student {
private static XiaoMing xiaoMing = new XiaoMing();
private static XiaoHua xiaoHua = new XiaoHua();
public static <T extends Student> T getInstance(T student) {
switch (student.toString()) {
case "XiaoMing":
return (T) xiaoMing;
case "XiaoHua":
return (T) xiaoHua;
default:
return null;
}
}
}
class XiaoMing extends Student {
@Override
public String toString() {
return "XiaoMing";
}
}
class XiaoHua extends Student {
@Override
public String toString() {
return "XiaoHua";
}
}
4.不能出现参数类型和数量都相同的构造器,但是可以有多个参数相同但名称不同的工厂方法
如:
//两个构造方法冲突
public class Student {
private String studentName;
private String phoneNumber;
public Student(String studentName) {
this.studentName = studentName;
}
public Student(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
改用静态工厂方法:
public class Student {
private String studentName;
private String phoneNumber;
public Student newStudentWithName(String studentName) {
Student student = new Student();
student.studentName = studentName;
return student;
}
public Student newStudentWithPhoneNumber(String phoneNumber) {
Student student = new Student();
student.phoneNumber = phoneNumber;
return student;
}
}