Java代码优化:静态工厂方法 Static Factory Method

Effective Java中提出了静态工厂,即不使用产品的constructor来提供产品,静态工厂不是开发模式,而是一种改进提供实例的策略。

如何实现?

很简单,静态工厂方法的定义是:一个返回类的实例的静态方法

这样做有什么好处?

1)静态工厂方法签名可读性强,封装了不必要的参数,减少了使用错误。
2)静态工厂方法不需要每次都new一个对象,可以取得预载或缓存对象
3)静态工厂方法可以返回对象的任意子类。
4)静态工厂的返回类型可以按照参数变化
5)静态工厂返回的对象可以推迟到运行时实例化,实现对象和使用者之间的解耦。

5个优点即是不使用静态工厂方法会遇到的5个缺点:
假设我们有一个手机产品有三种颜色红/黄/黑,我们传统获取实例的模式可能是下面这样,new产品对象。

	String color = "red";
	Phone redPhone = new Phone(color); 

Phone的构造函数可能是这样的:

	private String color;
	/*
	 * 判断颜色,红/黄/黑就初始化手机颜色,规定颜色以外就默认手机是黑色
	 */
	public Phone(String color){
		//按条件初始化this.color
	}

1)用户要取得特定的Phone,必须知道构造参数的意义,如果参数增多,用户容易犯错!使用体验就是失败的。
2)用户每次取得手机都new一个Phone,对不可变类或视图场景下浪费资源。
3)用户无法通过Phone作为接口去获取下属产品的信息和功能,比如苹果和安卓,只能另外去找苹果和安卓的手机接口。
4)输入相同类型的构造参数,返回类型只能相同。
5)使用Phone功能前,先创建实例,而不是需要使用功能时才创建实例。

注:这里的“用户"可以指Phone的被依赖类

然而用静态方法调用实例可能是这样的

Phone redPhone = Phone.getRedPhone();

Phone的构造函数多了几个静态方法,封装了构造器

	private String color;
	/*
	 * 判断颜色,红/黄/黑就初始化手机颜色,规定颜色以外就默认手机是黑色
	 */
	private Phone(String color){
		//按条件初始化this.color
	}
	public static Phone getRedPhone(){
		return new Phone("Red");
	}
	public static Phone getBlackPhone(){
		return new Phone("Black");
	}
	public static Phone getYellowPhone(){
		return new Phone("Yellow");
	}

取得手机不再依靠同一签名的构造方法,并且限制了用户的输入错误。从而优化了取得实例的方式。
这种思路再进一步放到工厂模式上,并使用反射,就能实现2),3),4),5)的优点。

猜你喜欢

转载自blog.csdn.net/OliverZang/article/details/85246011