构造器创建对象示例
public Boolean(String b)
{
this.toBoolean(b);
}
//创建对象
Boolean b = new Boolean("true");
静态工厂模式创建对象示例
public static Boolean valueOf(String s)
{
return toBoolean(s) ? TRUE : FALSE;
}
// 创建对象
Boolean b = Boolean.valueOf("true");
使用静态工厂方法体构造器的优点
- 静态工厂方法有方法名,可读性强
构造方法可以有多个,但构造方法没有方法名,只能根据不同的参数列表确定的到的实例。但不查询文档基本上无法确定不同构造方法的作用
静态工厂方法也能有多个,但可以根据规范的方法名确定某个方法的用途。
public class MaxAndMin
{
/**
* 最小值
*/
private int min = Integer.MIN_VALUE;
/**
* 最大值
*/
private int max = Integer.MAX_VALUE;
/**
* 大于min 小于max
*
* @param min
* @param max
*/
public MaxAndMin(int min, int max)
{
this.min = min;
this.max = max;
}
public MaxAndMin(int min)
{
this.min = min;
}
/**
* 大于min 小于max
*
* @param min
* @param max
*/
public static MaxAndMin between(int min, int max)
{
return new MaxAndMin(min, max);
}
/**
* 大于min 小于Integer.MAX_VALUE
*
* @param min
*/
public static MaxAndMin biggerThan(int min)
{
return new MaxAndMin(min, Integer.MAX_VALUE);
}
/**
* 大于Integer.MIN_VALUE 小于max
*
* @param max
*/
public static MaxAndMin smallerThan(int max)
{
return new MaxAndMin(Integer.MIN_VALUE, max);
}
}
- 静态工厂方法调用时不需要实例化对象
//使用构造器
MaxAndMin maxAndMIn = new MaxAndMin (1,10);
//使用静态工厂方法
MaxAndMin maxAndMIn = MaxAndMin.between(1,10);
- 静态方法可以放回元返回类型的所有子类
public static Dog getInstance()
{
return new RedDog();//或者return new BlackDog();
}
- 静态方法代码更加简洁
class TestMap<K, V>
{
public TestMap()
{
}
public static <K, V> TestMap<K, V> newInstance()
{
return new TestMap<K, V>();
}
}
// 调用构造方法
TestMap<String, String> map1 = new TestMap<String, String>();
//更加简洁,不需要重复指明类型参数,可以自行推导出来
TestMap<String, String> map2 = TestMap.newInstance();
使用静态工厂方法的缺点
- 如果类不含public或protect的构造方法,将不能被继承;
可被继承:
class TestMap<K, V>
{
public TestMap()
{
}
public static <K, V> TestMap<K, V> newInstance()
{
return new TestMap<K, V>();
}
}
不可以被继承:
class TestMap<K, V>
{
privateTestMap()
{
}
public static <K, V> TestMap<K, V> newInstance()
{
return new TestMap<K, V>();
}
}
- 与其它普通静态方法没有区别,没有明确的标识一个静态方法用于实例化类
一般一个静态工厂方法需要有详细的注释,遵守标准的命名,如使用getInstance、valueOf、newInstance等方法名;
静态工厂方法和工厂方法模式的区别
- 静态工厂方法:是某个类里的静态方法,通过调用该静态方法可以得到属于该类的一个实例
- 工厂方法模式:是一种设计模式,指的是让具体的工厂对象负责生产具体的产品对象,这里涉及多种工厂(类),多种对象(类),如内存工厂生产内存对象,CPU工厂生产CPU对象
- 如果要说相似的话,静态工厂方法跟简单工厂模式倒有那么点像,不过区别也挺大,简单工厂模式里的静态工厂方法会创建各种不同的对象(不同类的实例),而静态工厂方法一般只创建属于该类的一个实例(包括子类);