
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明IT培训的老师给大家分享一下使用静态工厂方法的优势。
1、可读性更强
假设我们需要写一个产生随即数的类RandomIntGenerator,该类有两个成员属性:最小值min和最大值max,
假设我们的需求是需要创建三种类型的RandomIntGenerator对象,
1、大于min,小于max;
2、大于min小于Integer.MAX_VALUE;
3、大于Integer.MIN_VALUE小于max
如果我们不使用静态工厂方法,代码一般如下设计:
class RandomIntGenerator
{
/**
*最小值
*/
private int min = Integer.MIN_VALUE;
/**
*最大值
*/
private int max = Integer.MAX_VALUE;
/**
*大于min小于max
* @param min
* @param max
*/
public RandomIntGenerator(int min, int max)
{
this.min = min;
this.max = max;
}
/**
*大于min小于Integer.MAX_VALUE
*/
public RandomIntGenerator(int min)
{
this.min = min;
}
// 报错:Duplicate method RandomIntGenerator(int) in type RandomIntGenerator
// /**
// *大于Integer.MIN_VALUE小于max
// */
// public RandomIntGenerator(int max)
// {
// this.max = max;
// }
}
观察以上代码,我们发现,以上代码不仅可读性差(new RandomIntGenerator(1, 10)与new RandomIntGenerator(10),不查文档,不看注释很难知道其创建的对象的具体含义),而且在设计最后一个构造方法的时候,还报错,因为已经存在一个参数一致的工作方法了,提示重复定义;
那么假设我们使用静态工厂方法会怎样呢,如下所示:
class RandomIntGenerator
{
/**
*最小值
*/
private int min = Integer.MIN_VALUE;
/**
*最大值
*/
private int max = Integer.MAX_VALUE;
/**
*大于min小于max
* @param min
* @param max
*/
public RandomIntGenerator(int min, int max)
{
this.min = min;
this.max = max;
}
/**
*大于min小于max
* @param min
* @param max
*/
public static RandomIntGenerator between(int min, int max)
{
return new RandomIntGenerator(min, max);
}
/**
*大于min小于Integer.MAX_VALUE
*/
public static RandomIntGenerator biggerThan(int min)
{
return new RandomIntGenerator(min, Integer.MAX_VALUE);
}
/**
*大于Integer.MIN_VALUE小于max
*/
public static RandomIntGenerator smallerThan(int max)
{
return new RandomIntGenerator(Integer.MIN_VALUE, max);
}
}
成功满足需求:创建三种类型的RandomIntGenerator对象,而且创建对象的时候,代码可读性比使用构造方法强;
2、调用的时候,不需要每次都创建一个新对象
JDK中的Boolean类的valueOf方法可以很好的印证这个优势,在Boolean类中,有两个事先创建好的Boolean对象(True,False)
public final class Boolean implements java.io.Serializable,
Comparable<Boolean>
{
/**
* The {@code Boolean} object corresponding to the primitive
* value {@code true}.
*/
public static final Boolean TRUE = new Boolean(true);
/**
* The {@code Boolean} object corresponding to the primitive
* value {@code false}.
*/
public static final Boolean FALSE = new Boolean(false);
当我们调用Boolean.valueOf("true")方法时,返回的就是这两个实例的引用,这样可以避免创建不必要的对象,如果使用构造器的话,就达不到这种效果了;
public static Boolean valueOf(String s) {
return toBoolean(s) ? TRUE : FALSE;
}
3、可以返回原返回类型的任何子类型对象
//RedDog和BlackDog为Dog的子类
public static Dog getInstance(){
return new RedDog();//或者return new BlackDog();
}
4、代码更加简洁
package tmp;
class MyMap<K,V> {
/**
*
*/
public MyMap()
{
}
public static <K,V> MyMap<K,V> ewInstance(){
return new MyMap<K, V>();
}
}
public class Main
{
public static void main(String[] args)
{
MyMap<String, String> map1 = new MyMap<String, String>();
//更加简洁,不需要重复指明类型参数,可以自行推导出来
MyMap<String, String> map2 = MyMap.newInstance();
}
}
下一期昆明IT培训的老师给大家讲讲他的缺点在哪里。